二十行代码构造多元线性回归的通用解法(手动加精!)

mac2024-05-21  30

代码实例(线性回归的定义?百度百科不香么)

引入模块

import numpy as np

定义判别函数(假设的)

def hyFunction(X,W): ''' :param X:行向量(需要扩维,常量位置为1在最后) :param W: 列向量 :return: ''' return X.dot(W) pass

定义梯度函数

def gradientFunction(X, W, y): return (X.dot(W) - y).dot(X) pass

定义梯度下降函数

def gradientDescent(X, w, y, hyFunc, gFunc, lamb = 0.001 , tolance = 1.0e-8, times = 2000000): ''' :param X: 样本 :param W: 猜的数据 :param y: 实际结果 :param hyFunc:判别函数 :param gFunc:梯度函数 :param lamb: 步进系数,与次数负相关,一般为0.1到0.001 :param tolance: 收敛条件,一般为10的负6次到10的负8次之间 :param times: 次数 :return: ''' #计算次数,用来与times比较 t = 0 # 上一次结算结果 result = hyFunc(X, w) # 上一次的梯度 g = gFunc(X, w, y) # 根据梯度和步进系数计算的新的点 newW = w - lamb*g # 代入判别函数计算新的结果值 newResult = hyFunc(X, newW) # 如果两次的结算结果的差值没有达到收敛条件,继续迭代 while np.sum(np.abs(result - newResult))/X.shape[0] > tolance: # 把点移动到新的点 w = newW result = newResult g = gFunc(X, w, y) newW = w - lamb * g newResult = hyFunc(X, newW) t += 1 # 避免无法收敛的情况 if t > times: break pass pass print(t) #检验次数,观察最佳的步进系数和次数 return w pass

样本及结果

# f(x1, x2) = w0 + w1*x1 + w2*x2 其中w1 = 2 w2 = 1 w0=3 X = np.array([[3, 0],[4, 1], [5,2], [7,3]]) y = np.array([9, 12,15, 20]) row = X.shape[0] #获取第一列 one = np.ones(row) #将同样式的数变为全1 print(one) one = one[:,np.newaxis] #扩维成行 print(one) X = np.hstack((X, one)) #将列添加到最后,对应常量 print(X) w = gradientDescent(X, np.array([100, 200, 20]), y, hyFunction, gradientFunction) #调用梯度下降函数 print(w)

结果截图

与猜测结果(2,1,3)接近,成功!

最新回复(0)