损失函数

线性回归与逻辑回归的损失函数是不一样的!!

线性回归是回归算法,所以是连续的,而逻辑回归是分类算法。

x=(x1,x2,x3xn)\vec x = (x_1,x_2,x_3 \dots x_n)

f(x)=w1x1+w2x2+w3x3++wnxn+bf(x) = w_1x_1+w_2x_2+w_3x_3+ \dots + w_nx_n + b

minS=12ni=1n(f(xi)yi)2minS = \frac {1} {2n} \sum_{i=1}^{n} {(f(x_i)-y_i)^2}

其中的 1n\frac1 n 只是将代价函数值归一化的系数。

表示每一个训练点 (xi,yi)(x_i,y_i) 到拟合直线 yiˆ=θxiy_iˆ=θ⋅x_i 的竖直距离的平方和,通过最小化上面的损失函数可以求得拟合直线的最佳参数 θθ
这里的损失函数之所以使用平方形式,是使用了“最小二乘法”的思想,这里的“二乘”指的是用平方来度量观测点与估计点的距离(远近),“最小”指的是参数值要保证各个观测点与估计点的距离的平方和达到最小。

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=waS(w,b)wbnew=baS(w,b)bw_{new} = w - a\frac {\partial S(w,b)}{\partial w},b_{new} = b - a\frac {\partial S(w,b)}{\partial b}

w=wnew,b=bneww = w_{new},b = b_{new}

代入S求得:

wj=wjα1mj=1n(f(xi)yi)xi,j{1,2,3n}w_j = w_j - \alpha \frac1m \sum_{j=1}^{n} {(f(x_i)-y_i)x_i},j\in\{1,2,3\cdots n\}

其中 α\alpha 是学习率。过小导致太慢,过大导致错过最值。

1
2
3
4
5
6
7
8
9
10
11
# 梯度下降
#theta就是[w,b]
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)
#regr.intercept_:参数b
#regr.coef_:参数w

 

更多理论知识,附上大佬博客

https://blog.csdn.net/bravery_again/article/details/81076621