线性回归的模型:
h(x)=θ0+θ1∗x1+θ2∗x2 , h(x)=∑ni=0θixi=θTX , 这里 x0=1 。
代价函数为:
J(θ)=12(y−h(x))2
代价函数的解释:
Y=θTX+ε , y(i)=θTx(i)+ε(i) , 这里,假设 ε 服从均值为0的高斯分布,即:
P(εi)=1(2π)δ√exp(−(y(i)−θTx(i))22δ2)
⇒ P(y(i)|(x(i);θ))=1(2π)δ√exp(−(y(i)−θTx(i))22δ2) 。
似然函数为:
L(θ)=∏ni=1P(y(i)|(x(i);θ))
对最似然函数求对数:
l(θ)=log(L(θ))=∑ni=1log(1(2π)δ√exp(−(y(i)−θTx(i))22δ2))
=nlog(12π√δ)−1δ212∑ni=0(y(i)−θTx(i))2
当对似然函数取最大值时,既是求 12∑ni=1(y(i)−θTx(i))2 的最小值,即:
J(θ)=12∑ni=1(y(i)−θTx(i))2=12(Xθ−Y)T(Xθ−Y) .
最小二乘意义下的参数最优:
∂J(θ)∂θ=XTXθ−XTY , 求驻点,
⇒θ=(XTX)−1XTY
当 XTX 不可逆, 或者为防止过拟合,可引入Lasso 回归或 岭回归。
J(θ)=12∑ni=0(y(i)−θTx(i))2+12λ∑mi=1θ2i
对 θ 求偏导数;
∂J(θ)∂θ=XTXθ−XTY+λθ ,
⇒θ=(XTX+λI)−1XTY
使用梯度下降法求 θ :
∂J(θ)∂θ=12∑ni=1(y(i)−θTx(i))2
⇒∂J(θ)∂θj=(y−h(x))∂(y−h(x))θj=(h(x)−y)xj
批量梯度下降:( n 是 样本数量 )
Repeat until convergence{
θj=θj+α∑ni=1(h(x(i))−y(i))x(i)j
}
随机梯度下降:(m 是参数 θ 的数量)
Loop {
for i to m
θj=θj+α(h(x(i)−y(i))x(i)j)
}
python代码实现:
#-*- coding:utf-8 -*-
import numpy as np
from numpy import *
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__=="__main__":
m = 7 # m 是样本数
n = 2 # n 是特征数目 + 1
x = mat(ones((2,m)))
x[1] = [-1,-2,0,0.5,1.2,0.9,-0.3]
y = mat(zeros((1,m)))
y = [1.2,0.3,3,2.65,3.1,2.75,1.5]
a = 0.01
Lamda = 0.001
theta = mat(ones((1,n)))
# 批量梯度下降
for i in range(1000):
for j in range(m):
y_hat = theta * x
theta[0,1]=theta[0,1] - a*(((y_hat-y).sum())*x[1,j] + Lamda*theta[0,1])
theta[0,0]=theta[0,0] - a*(((y_hat-y).sum())*x[0,j] + Lamda*theta[0,0])
# 随机梯度下降
# for i in range(500):
# for j in range(m):
# y_hat = theta[0,0]*x[0,j] + theta[0,1]*x[1,j]
# theta[0,0] = theta[0,0] - a*(y_hat - y[j])*x[0,j]
# theta[0,1] = theta[0,1] - a*(y_hat - y[j]) * x[1,j]
print theta
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x[1], y, s=30, c='red', marker='s')
xc = arange(-3.0, 3.0, 0.1) # x 轴的取值范围
y_hat = theta[0,0] + theta[0,1]*xc # 由参数计算分解线
ax.plot(xc, y_hat)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()