from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()
print(x_data.shape)
# 调整数据格式
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
# 创建并拟合模型
model = LinearRegression()
model.fit(x_data, y_data)
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()
多元线性回归的求解和一元线性回归异曲同工,无非是求导的次数增加了
f ( x ) = θ 0 + θ 1 ∗ x 1 + . . . + θ n ∗ x n f(x) = \theta_0+\theta_1*x_1+...+\theta_n*x_n f(x)=θ0+θ1∗x1+...+θn∗xn
Γ ( θ 0 , θ 1 , . . . , θ n ) = 1 2 m ∑ i = 1 m ( y i − h θ ( x i ) ) 2 \Gamma(\theta_0,\theta_1,...,\theta_n) = \frac{1}{2m}\sum_{i=1}^{m}(y^i-h_\theta(x^i))^2 Γ(θ0,θ1,...,θn)=2m1i=1∑m(yi−hθ(xi))2
每一次迭代更新权值
θ j : = θ j − α ∂ ∂ θ j Γ ( θ 0 , θ 1 ) ( f o r 1 j = 0... n ) \theta_j:=\theta_j-\alpha \frac{\partial }{\partial \theta_j}\Gamma(\theta_0,\theta_1)(for \hphantom{1} j=0...n) θj:=θj−α∂θj∂Γ(θ0,θ1)(for1j=0...n)
多项式方程:
f ( x ) = θ 0 + θ 1 ∗ x + . . . + θ n ∗ x n f(x) = \theta_0+\theta_1*x+...+\theta_n*x^n f(x)=θ0+θ1∗x+...+θn∗xn
梯度下降法求解:
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("job.csv", delimiter=",")
x_data = data[1:,1]
y_data = data[1:,2]
x_data = x_data[:,np.newaxis]
y_data = y_data[:,np.newaxis]
# 训练模型
model = LinearRegression()
model.fit(x_data, y_data)
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()
# 定义多项式回归,degree的值可以调节多项式的特征
poly_reg = PolynomialFeatures(degree=3)
# 特征处理
x_poly = poly_reg.fit_transform(x_data)
# 定义回归模型
lin_reg = LinearRegression()
# 训练模型
lin_reg.fit(x_poly, y_data)
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, lin_reg.predict(x_poly), c='r')
plt.show()
标准方程法:
标准方差法与递归下降法主要区别在于其代价函数(cost function)不一致
J ( θ ) = a θ 2 + b θ + c J( \theta) =a\theta^2+b\theta+c J(θ)=aθ2+bθ+c
∂ ∂ θ J ( θ ) = 0 \frac{\partial }{\partial \theta}J(\theta)=0 ∂θ∂J(θ)=0
以此求解 θ 0 , . . . , θ n \theta_0,...,\theta_n θ0,...,θn
优缺点:
梯度下降法 | 标准方程法 |
---|---|
需要选择学习速率α | 不需要选择学习速率α |
需要多次迭代 | 不需要多次迭代 |
即使n很大,也能很好的工作 | 当n很大,因为需要计算(XTX)-1,会计算的非常慢 |
总结:
当n比较大的时候(通常n>10000),选择梯度下降法
当n不是很大(通常n<10000),选择标准方程法