def J(theta, X_b, y):
try:
return np.sum((y - X_b.dot(theta))**2) / len(X_b)
except:
return float('inf')
def dJ(theta, X_b, y):
res = np.empty(len(theta))
res[0] = np.sum(X_b.dot(theta) - y)
for i in range(1, len(theta)):
res[i] = (X_b.dot(theta) - y).dot(X_b[:,i])
return res * 2 / len(X_b)
def gradient_descent(X_b, y, initial_theta, eta, n_iters = 1e4, epsilon=1e-8):
theta = initial_theta
cur_iter = 0
while cur_iter < n_iters:
gradient = dJ(theta, X_b, y)
last_theta = theta
theta = theta - eta * gradient
if(abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
break
cur_iter += 1
return theta
X_b = np.hstack([np.ones((len(x), 1)), x.reshape(-1,1)])
initial_theta = np.zeros(X_b.shape[1])
eta = 0.01
theta = gradient_descent(X_b, y, initial_theta, eta)
theta
array([4.02145786, 3.00706277])
所谓回归,就是根据已知数据集及其标签集预测出一个模型,并可以根据这个预测出来的模型预测出未知标签的数据对应的值。常见的回归方法有:线性回归、Lasso回归、Ridge回归、多项式回归、决策树等。线性回归,就是根据实际数据集和标签集,找到最符合的,使得成立。其中为实际值与预测值之间的误差值。那么,怎么求解最优的拟合直线呢?根据中心极限定理,可知误差值服从高斯分布。在这里,我们省略极大似然估计过程,直...
1、梯度下降法
前文在求解损失函数的最小值的时候,使用到了最小二乘法,但是有一定的缺陷,当数据量大的时候,计算量就变大了,效率就体现不出来了。梯度下降法是求解目标函数最优解的一个比较通用的方法。
梯度: 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。沿着梯度向量的方向更易找到函数最大值,沿着梯度向量相反的方向更易找到最小值。
2、一元线性回归中的梯度下降
可以使用:x=x−ηdfdxx=x-\eta\frac{df}{dx}x=x−ηdxdf ,来
对于线性回归的问题,我们的损失函数 J:
也就是每一次线性预测的结果和这个数据对应的真值之间差的平方的和,就是我们的损失函数 J。而对于我们的参数来说,绝不仅仅只有一个 theta,我们这个 theta 是一个向量,从 0 到 n 一共有 n+1 个元素,其中 n 是我们样本中的特征数量。
即使是对于我们的简单线性回归来说,也就是只有一个样本特征的情况