版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Daycym/article/details/84305395
回顾
回归分析之线性回归 中我们得到了线性回归的损失函数为:
J(θ)=21i=1∑m(hθ(x(i))−y(i))2
θ 的求解够
- 将损失函数用向量的形式表示:
J(θ)=21i=1∑m(hθ(x(i))−y(i))2=21(Xθ−Y)T(Xθ−Y)
hθ(x(i))=θ1x1(i)+θ2x2(i)+...+θmxm(i)
X=⎣⎢⎢⎢⎡x1(1)x1(2)x1(m)x2(1)x2(2)x2(m)............xn(1)xn(2)xn(m)⎦⎥⎥⎥⎤
θ=⎣⎢⎢⎡θ1θ2...θn⎦⎥⎥⎤
Y=⎣⎢⎢⎡y(1)y(2)...y(m)⎦⎥⎥⎤
- m 表示样本的数量,n 表示每个样本的特征数量
-
(i)表示第 i 个样本
-
Xθ=Y^ 表示模型预测的结果,
Y表示样本的真实值
- 损失矩阵对
θ求导:
∇θJ(θ)=∇θ(21(Xθ−Y)T(Xθ−Y))
=∇θ(21(θTXT−YT)(Xθ−Y))
=∇θ(21(θTXTXθ−θTXTY−YTXθ+YTY))
=21(2XTXθ−XTY−(YTX)T)
=XTXθ−XTY
- 令上式为0
θ=(XTX)−1XTY
最小二乘法
参数解析式:
θ=(XTX)−1XTY
最小二乘法的使用要求矩阵
XTX是可逆的;为了防止不可逆或者过拟合的问题存在,可以增加额外数据影响,导致最终的矩阵是可逆的:
θ=(XTX+λI)−1XTY
其原因在于:
J(θ)=21(Xθ−Y)T(Xθ−Y)+λθTθ
∇θJ(θ)=XTXθ−XTY+λθ
令上式为0:
XTXθ−XTY+λθ=0
XTXθ−XTY+λθ=0
(XTX+λI)θ=XTY
θ=(XTX+λI)−1XTY
上面在损失函数中加入了L2-norm
最小二乘法直接求解的难点:矩阵逆的求解是一个难处
使用最小二乘法预测家庭用电(功率与电流的关系)
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import time
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
path1='datas/household_power_consumption_1000.txt'
df = pd.read_csv(path1, sep=';', low_memory=False)
X = df.iloc[:,2:4]
Y2 = df.iloc[:,5]
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y2, test_size=0.2, random_state=0)
X = np.mat(X2_train)
Y = np.mat(Y2_train).reshape(-1,1)
theta = (X.T * X).I * X.T * Y
y_hat = np.mat(X2_test) * theta
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真实值')
plt.plot(t, y_hat, 'g-', linewidth=2, label=u'预测值')
plt.legend(loc = 'lower right')
plt.title(u"线性回归预测功率与电流之间的关系", fontsize=20)
plt.grid(b=True)
plt.show()
运行结果:
由高中物理可知,功率与电流之间存在固定的计算公式
代码可见: Github下01_最小二乘法.py