算法函数 使用numpy 库来写出梯度下降的通用方法:
import numpy as np def hyFunction(X, W): # 定义假设函数:X是一个行向量 W是一个列向量 return X.dot(W) def costFunction(X, W, y): # 成本函数:X是矩阵,W是向量,y也是向量 return ((X.dot(W) - y).dot(X))*2 #一次计算所有的W的梯度值 def gradientFunction(X, W, y):# 梯度函数: return (X.dot(W) - y).dot(X) # 行向量 def gradientDescent(X, w, y, hyFunc, gFunc, lamb = 0.001 , tolance = 1.0e-8, times = 2000000): # 定义梯度下降算法 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 print(t) return w把下列数据放到上面的函数中进行结果验证:
# 构造数据:验证算的有效性 # 下列x和y是使用函数:y=0.5*x*x*x+1.2*x*x-2.3*x+10 大致计算出来的 ''' x = np.array([-3, -2.3, -1.6, -1, -0.3, 0.3, 1, 1.6, 2.3, 3]) y = np.array([14.2, 15.5, 14.8, 13., 10.8, 9.4, 9.4, 11.8, 17.5, 27.4]) def make_x_ext(X): x_ext = np.c_[X[:,np.newaxis], np.ones(len(X))] # 追加全1列 x_ext = np.insert(x_ext, 0, np.power(X, 2), axis=1) # 插入x*x数据列 x_ext = np.insert(x_ext, 0, np.power(X, 3), axis=1) # 插入x*x*x数据列 return x_ext w_init = np.array([2.5, 3.0, 1.2, 0.7]) # 猜测这就是最优的系数 x_ext = make_x_ext(x) w = gradientDescent(x_ext, w_init, y, hyFunction, gradientFunction) print(w) ''' ''' # 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) 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)运行次数与结果