代码实例(线性回归的定义?百度百科不香么)
引入模块
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)接近,成功!