损失函数
线性回归与逻辑回归的损失函数是不一样的!!
线性回归是回归算法,所以是连续的,而逻辑回归是分类算法。
x=(x1,x2,x3…xn)
f(x)=w1x1+w2x2+w3x3+⋯+wnxn+b
minS=2n1i=1∑n(f(xi)−yi)2
其中的 n1 只是将代价函数值归一化的系数。
表示每一个训练点 (xi,yi) 到拟合直线 yiˆ=θ⋅xi 的竖直距离的平方和,通过最小化上面的损失函数可以求得拟合直线的最佳参数 θ 。
这里的损失函数之所以使用平方形式,是使用了“最小二乘法”的思想,这里的“二乘”指的是用平方来度量观测点与估计点的距离(远近),“最小”指的是参数值要保证各个观测点与估计点的距离的平方和达到最小。
1 2 3 4 5 6 7
| def computeCost(X, y, theta=[[0],[0]]): m = y.size J = 0 h = X.dot(theta) J = 1.0/(2*m)*(np.sum(np.square(h-y))) return J
|
优化
以最小二乘法,将S看作w,b的函数,对w,b求偏导数,使偏导数为0,可以直接求出w,b的值。但实际应用中,由于数据量太大,反而效果不好。
梯度下降
为了降低损失函数,采用梯度下降的优化方法。
逐步调整参数w,b。
wnew=w−a∂w∂S(w,b),bnew=b−a∂b∂S(w,b)
w=wnew,b=bnew
代入S求得:
wj=wj−αm1j=1∑n(f(xi)−yi)xi,j∈{1,2,3⋯n}
其中 α 是学习率。过小导致太慢,过大导致错过最值。
1 2 3 4 5 6 7 8 9 10 11
|
def gradientDescent(X, y, theta=[[0],[0]], alpha=0.01, num_iters=1500): m = y.size J_history = np.zeros(num_iters) for iter in np.arange(num_iters): h = X.dot(theta) theta = theta - alpha*(1.0/m)*(X.T.dot(h-y)) J_history[iter] = computeCost(X, y, theta) return(theta, J_history)
|
调用Scikit-learn中的线性回归:
1 2 3 4 5
| regr = LinearRegression() regr.fit(X[:,1].reshape(-1,1), y.ravel()) print(regr.intercept_+regr.coef_*xx)
|
更多理论知识,附上大佬博客
https://blog.csdn.net/bravery_again/article/details/81076621