机器学习笔记
线性回归
对于给定的特征X和标签y,可以直接调用sklearn
里的LinearRegression()
类初始化一个线性回归模型,之后通过fit()函数在给定的数据上做拟合。
# 实例化一个线性回归模型
regr = linear_model.LinearRegression()
# 拟合给定数据
regr.fit(X_train,y_train)
拟合完之后对象regr里存储着已经训练好的线性回归模型的参数,并可以使用regr来对未来的数据做预测了。这里需要注意的是,对于给定的数据我们可以提前分好训练集和测试集。
验证模型效果
对于验证模型的效果,可以从两个方面考虑。一方面,我们可以观察在训练数据上的 拟合度 ,另外一方面观察在测试数据上的 预测能力 。在训练数据上的拟合度是根本,如果在训练数据上都没有很好地拟合,就更不要谈测试数据上的验证了。
对于线性回归模型,它的拟合度可以通过真实值和预测值之间的误差来表示,具体计算细节会在线性回归的部分做更详细的讲解。
# 计算好训练好的模型在训练数据的拟合度
print(regr.score(X_train, y_train))
# 可视化在训练数据上拟合后的线条,这部分通过matplotlib库来实现,线条可以通过plot()函数来实现
# 首先,画出给定的训练数据
plt.scatter(x_train,y_train, color="red")
# 画出训练好的线条
plt.plot(x_train, regr.predict(x_train), color="blue")
# 画出x,y的标题
plt.xlabels('height(cm)')
plt.ylabels("weight(kg)")
编程实现
这里我们使用一个线性回归模型来拟合身高-体重的数据,也就是希望通过身高来预测标准体重。我们需要在训练数据上拟合模型,并在测试数据上做效果的评估。
%matplotlib inline
# 引用 sklearn库,主要为了使用其中的线性回归模块
from sklearn import datasets, linear_model
# train_test_split用来把数据集拆分为训练集和测试集
from sklearn.model_selection import train_test_split
# 引用numpy库,主要用来做科学计算
import numpy as np
# 引用matplotlib库,主要用来画
import matplotlib.pyplot as plt
# 创建数据集,把数据写入到numpy数组
data = np.array([[152,51],[156,53],[160,54],[164,55],
[168,57],[172,60],[176,62],[180,65],
[184,69],[188,72]])
# 打印出数据大小
print("The size of dataset is (%d,%d)"% data.shape)
# X,y分别存放特征向量和标签. 注:这里使用了reshape(-1,1), 其主要的原因是
# data[:,0]是一维的数组(因为只有一个特征),但后面调用模型的时候对特征向量的要求
# 是矩阵的形式,所以这里做了reshape的操作。
X,y = data[:,0].reshape(-1,1), data[:,1]
# 使用train_test_split函数把数据随机分为训练数据和测试数据。 训练数据的占比由
# 参数train_size来决定。如果这个值等于0.8,就意味着随机提取80%的数据作为训练集
X_train , X_test , y_train , y_test =train_test_split(X,y,train_size=0.8)
# 实例化一个线性回归的模型
regr = linear_model.LinearRegression()
# 在X_train,y_train上训练一个线性回归模型。 如果训练顺利,则regr会存储训练完成之后的结果模型
regr.fit(X_train, y_train)
# 在训练集上做验证,并观察是否训练得当,首先输出训练集上的决定系数R平方值
print ("Score for training data %.2f"% regr.score(X_train, y_train))
# 画训练数据
plt.scatter(X_train, y_train, color='red')
# 画在训练数据上已经拟合完毕的直线
plt.plot(X_train,regr.predict(X_train),color="blue")
# 画测试数据
plt.scatter(X_test, y_test, color='black')
# 画x,y轴的标题
plt.xlabel('height (cm)')
plt.ylabel('weight(kg)')
plt.show()
# 输出在测试集上的决定系数R平方值
print ("Score for testing data %.2f"%regr.score(X_test, y_test))
print ("Prediction for a person with height 163 is: %.2f"%regr.predict([[163]]))
线性回归以及应用场景
线性回归作为一个必不可少的方法论,在几乎所有的回归问题上都可以派上用场。
线性会对的特点:
- 最简单的回归模型
- 适用于几乎所有的回归模型
- 可解释性强
- 适用于大数据
线性回归的应用:股价预测、营收预测、销量预测、成绩预测等
- 几乎所有的回归问题都可以使用线性回归来解决
- 线性回归训练效率高,可用于数据量特别大的情况
- 线性回归的可解释性强,这也是很多模型不具备的优点
目标函数:平方误差
定义误差
设蓝点为[[152,51],[156,53],[160,54],[164,55],[168,57],[172,60],[176,62],[180,65],[184,69],[188,72]],红线为线性回归拟合的直线
设蓝点的坐标为
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),
y
~
i
\tilde{y}_i
y~i表示预测值,则
ε
i
=
∣
y
~
i
−
y
i
∣
\varepsilon_i=|\tilde{y}_i-y_i|
εi=∣y~i−yi∣表示误差,故平方误差为:
ε
2
=
∑
i
=
1
N
ε
i
2
\varepsilon^2=\sum_{i=1}^N \varepsilon_i^2
ε2=i=1∑Nεi2
我们吧上述的误差表示成了包含
ε
\varepsilon
ε的式子,用其来表式真实值和预测值之间的差异。
一条线可以由两个参数来表示,分别是斜率 w w w和偏移量 b b b,所以寻求拟合度最好的那条线实际上是求解最好的 w w w和 b b b值。为了求解这两个值,我们需要把 ε \varepsilon ε表示成包含 w , b w,b w,b的函数,这样一来整个误差就可以表示成包含 w , b w,b w,b的函数。
①拟合曲线的参数可以表示为
y
=
w
x
+
b
y=wx+b
y=wx+b
②设
l
=
ε
2
l=\varepsilon^2
l=ε2,其中
l
l
l为当误差最小时的值,其中
ε
i
2
=
(
y
i
−
y
~
i
)
2
y
~
i
=
w
x
i
+
b
∴
l
=
∑
i
=
1
N
(
y
i
−
w
x
i
−
b
)
2
=
∑
i
=
1
N
(
w
x
i
+
b
−
y
i
)
2
\varepsilon_i^2=(y_i-\tilde{y}_i)^2\\ \tilde{y}_i=wx_i+b\\ ∴l=\sum_{i=1}^N (y_i-wx_i-b)^2\\ \ \ \ \ \ =\sum_{i=1}^N (wx_i+b-y_i)^2
εi2=(yi−y~i)2y~i=wxi+b∴l=i=1∑N(yi−wxi−b)2 =i=1∑N(wxi+b−yi)2
上式为目标函数(objective function),有了目标函数我么就可以通过最小化误差,求得
w
,
b
w,b
w,b的值,进而求得拟合曲线,这就是模型训练的过程。
求解一元函数的最优解
一元线性回归的最小二乘法
对于一元线性回归的求解,我们首先把样本误差的平方作为 目标函数 ,再通过优化算法去寻求最优参数 w , b w,b w,b,整个过程称之为普通最小二乘法(ordinary least-square method)。利用 求导 的方法来求解 **极值点 (extreme point)**是解决最小二乘的一个经典的优化方法.。
线性回归的求解:
假设我们定义数据集: D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D=\begin{Bmatrix}(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\end{Bmatrix} D={(x1,y1),(x2,y2),...,(xN,yN)}, N N N是样本总数。
第一步:先求目标函数对
b
b
b的偏导
l
=
∑
i
=
1
N
(
w
x
~
i
+
b
−
y
i
)
2
令
偏
导
等
于
零
:
∂
l
∂
b
=
∑
i
=
1
N
2
(
w
x
i
+
b
−
y
i
)
=
0
b
=
∑
i
=
1
N
y
i
−
w
∑
i
=
1
N
x
i
N
其
中
令
X
ˉ
=
1
N
∑
i
=
1
N
x
i
Y
ˉ
=
1
N
∑
i
=
1
N
y
i
即
:
b
=
Y
ˉ
−
w
X
ˉ
l =\sum_{i=1}^N (w\tilde{x}_i+b-y_i)^2 \\ 令偏导等于零:\frac{\partial l}{\partial b}=\sum_{i=1}^N2(wx_i+b-y_i)=0 \\ b=\frac{\sum_{i=1}^Ny_i-w\sum_{i=1}^Nx_i}{N} \\ 其中令\bar{X}=\frac{1}{N}\sum_{i=1}^Nx_i \\ \ \ \ \ \ \ \ \ \ \ \bar{Y}=\frac{1}{N}\sum_{i=1}^Ny_i \\ 即:b=\bar{Y}-w\bar{X}
l=i=1∑N(wx~i+b−yi)2令偏导等于零:∂b∂l=i=1∑N2(wxi+b−yi)=0b=N∑i=1Nyi−w∑i=1Nxi其中令Xˉ=N1i=1∑Nxi Yˉ=N1i=1∑Nyi即:b=Yˉ−wXˉ
第二步:再求目标函数对
w
w
w的偏导
l
=
∑
i
=
1
N
(
w
x
~
i
+
b
−
y
i
)
2
令
偏
导
等
于
零
:
∂
l
∂
w
=
∑
i
=
1
N
2
x
i
(
w
x
i
+
b
−
y
i
)
=
0
将
b
=
Y
ˉ
−
w
X
ˉ
代
入
化
简
得
:
w
∑
i
=
1
N
x
i
2
+
Y
ˉ
∑
x
=
1
N
x
i
−
w
X
ˉ
∑
i
=
1
N
x
i
−
∑
i
=
1
N
x
i
y
i
=
0
N
w
X
2
‾
+
N
Y
ˉ
X
ˉ
−
N
w
X
ˉ
2
−
N
X
Y
‾
=
0
故
:
w
=
X
Y
‾
−
X
ˉ
Y
ˉ
X
2
‾
−
X
ˉ
2
其
中
令
X
ˉ
=
1
N
∑
i
=
1
N
x
i
Y
ˉ
=
1
N
∑
i
=
1
N
y
i
X
2
‾
=
1
N
∑
i
=
1
N
x
i
2
X
Y
‾
=
1
N
∑
i
=
1
N
x
i
y
i
l =\sum_{i=1}^N (w\tilde{x}_i+b-y_i)^2 \\ 令偏导等于零:\frac{\partial l}{\partial w}=\sum_{i=1}^N2x_i(wx_i+b-y_i)=0 \\ 将\ \ b=\bar{Y}-w\bar{X}\ \ 代入化简得:\\ w\sum_{i=1}^Nx_i^2+\bar{Y}\sum_{x=1}^Nx_i-w\bar{X}\sum_{i=1}^Nx_i-\sum_{i=1}^Nx_iy_i=0\\ Nw\overline{X^2}+N\bar{Y}\bar{X}-Nw\bar{X}^2-N\overline{XY}=0\\ 故:w=\frac{\overline{XY}-\bar{X}\bar{Y}}{\overline{X^2}-\bar{X}^2}\\ 其中令\bar{X}=\frac{1}{N}\sum_{i=1}^Nx_i \\ \ \ \ \ \ \ \ \ \ \ \ \bar{Y}=\frac{1}{N}\sum_{i=1}^Ny_i\\ \ \ \ \ \ \ \ \ \ \ \ \overline{X^2}=\frac{1}{N}\sum_{i=1}^Nx_i^2\\ \ \ \ \ \ \ \ \ \ \ \ \overline{XY}=\frac{1}{N}\sum_{i=1}^Nx_iy_i\\
l=i=1∑N(wx~i+b−yi)2令偏导等于零:∂w∂l=i=1∑N2xi(wxi+b−yi)=0将 b=Yˉ−wXˉ 代入化简得:wi=1∑Nxi2+Yˉx=1∑Nxi−wXˉi=1∑Nxi−i=1∑Nxiyi=0NwX2+NYˉXˉ−NwXˉ2−NXY=0故:w=X2−Xˉ2XY−XˉYˉ其中令Xˉ=N1i=1∑Nxi Yˉ=N1i=1∑Nyi X2=N1i=1∑Nxi2 XY=N1i=1∑Nxiyi
最终得到线性回归曲线的参数 w , b w,b w,b
{ w = X Y ‾ − X ˉ Y ˉ X 2 ‾ − X ˉ 2 b = Y ˉ − w X ˉ \begin{cases} w=\frac{\overline{XY}-\bar{X}\bar{Y}}{\overline{X^2}-\bar{X}^2} \\ b=\bar{Y}-w\bar{X} \\ \end{cases} {w=X2−Xˉ2XY−XˉYˉb=Yˉ−wXˉ
一元线性回归编程实现
# 线性回归手动实现
# 创建数据集,把数据写入到numpy数组
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
data = np.array([[152,51],[156,53],[160,54],[164,55],
[168,57],[172,60],[176,62],[180,65],
[184,69],[188,72]])
# 将数据分为x,y
x,y = data[:,0], data[:,1]
# 打印x,y的大小
print(x.shape,y.shape)
# 手动实现一元线性回归算法
# 实现w和b参数,这里w是斜率,b是偏移量
w = (np.mean(x*y)-np.mean(x)*np.mean(y))/(np.mean(x**2)- (np.mean(x))**2)
b = np.mean(y) - w*np.mean(x)
print("通过手动实现的线性回归模型参数: %.5f %.5f"%(w,b))
# 使用sklearn来实现线性回归模型,可以用来比较与手动实现的结果
from sklearn.linear_model import LinearRegression
# 实例化线性回归模型
regr = LinearRegression()
model = regr.fit(x.reshape(-1,1),y)
print("基于sklearn的线性回归模型参数:%.5f %.5f"%(model.coef_,model.intercept_))
"""
输出结果为:
(10,) (10,)
通过手动实现的线性回归模型参数: 0.57576 -38.07879
基于sklearn的线性回归模型参数:0.57576 -38.07879
"""
L2范数(Norm)是指向量各元素的平方和然后求平方根
多元线性回归
在大多数情况下,给定的数据通常会包含多个特征,所以更实用的还是度欧安线性回归模型。多元线性回归除了特征的增加,本质上与一元线性回归没有区别。
多元线性回归的模型:
y
i
~
=
w
j
x
i
1
+
w
j
x
i
2
+
.
.
.
+
w
j
x
i
j
+
b
\tilde{y_i}=w_jx_{i1}+w_jx_{i2}+...+w_jx_{ij}+b
yi~=wjxi1+wjxi2+...+wjxij+b
y
i
~
=
∑
j
=
1
d
w
j
x
i
j
+
b
\tilde{y_i}=\sum_{j=1}^dw_jx_{ij}+b
yi~=j=1∑dwjxij+b
多元线性回归的目标函数
假设我们定义数据集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
,
x
i
∈
R
d
,
y
i
∈
R
D=\begin{Bmatrix}(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\end{Bmatrix},x_i\in R^d,y_i\in R
D={(x1,y1),(x2,y2),...,(xN,yN)},xi∈Rd,yi∈R
设
w
=
(
w
1
,
w
2
,
.
.
.
,
w
d
)
,
b
∈
R
平
方
误
差
为
:
ε
2
=
∑
i
=
1
N
ε
i
2
其
中
:
ε
i
2
=
(
y
~
i
−
y
i
)
2
=
(
∑
j
=
1
α
w
i
x
i
j
+
b
−
y
i
)
2
∴
l
=
∑
i
=
1
N
ε
i
2
=
∑
i
=
1
N
(
∑
j
=
1
d
w
i
x
i
j
+
b
−
y
i
)
2
故
多
元
线
性
回
归
的
目
标
函
数
为
:
l
=
∑
i
=
1
N
(
∑
j
=
1
d
w
i
x
i
j
+
b
−
y
i
)
2
设w=(w_1,w_2,...,w_d),b \in R \\ 平方误差为:\varepsilon^2=\sum_{i=1}^N \varepsilon_i^2 \\ 其中:\varepsilon_i^2=(\tilde{y}_i-y_i)^2\\ =(\sum_{j=1}^αw_ix_{ij}+b-y_i)^2\\ ∴l=\sum_{i=1}^N\varepsilon_i^2\\ \ \ \ \ \ =\sum_{i=1}^N(\sum_{j=1}^dw_ix_{ij}+b-y_i)^2 \\ 故多元线性回归的目标函数为:l=\sum_{i=1}^N(\sum_{j=1}^dw_ix_{ij}+b-y_i)^2
设w=(w1,w2,...,wd),b∈R平方误差为:ε2=i=1∑Nεi2其中:εi2=(y~i−yi)2=(j=1∑αwixij+b−yi)2∴l=i=1∑Nεi2 =i=1∑N(j=1∑dwixij+b−yi)2故多元线性回归的目标函数为:l=i=1∑N(j=1∑dwixij+b−yi)2
多元线性回归模型目标函数(矩阵形态)
由
上
可
知
:
l
=
∑
i
=
1
N
(
∑
j
=
1
d
w
i
x
i
j
+
b
−
y
i
)
2
由上可知:l=\sum_{i=1}^N(\sum_{j=1}^dw_ix_{ij}+b-y_i)^2
由上可知:l=i=1∑N(j=1∑dwixij+b−yi)2
定义:
X
=
[
1
x
11
⋯
x
1
d
⋮
⋮
⋱
⋮
1
x
n
1
⋯
x
n
d
]
X=\begin{bmatrix} 1 & x_{11} & \cdots & x_{1d} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n1} & \cdots & x_{nd} \end{bmatrix} \\
X=⎣⎢⎡1⋮1x11⋮xn1⋯⋱⋯x1d⋮xnd⎦⎥⎤
w
=
[
w
0
w
1
w
2
⋮
w
d
]
w=\begin{bmatrix} w_0\\ w_1 \\ w_2 \\ \vdots\\ w_d \end{bmatrix}
w=⎣⎢⎢⎢⎢⎢⎡w0w1w2⋮wd⎦⎥⎥⎥⎥⎥⎤
令
b
=
[
w
0
w
0
⋮
w
0
]
令b = \begin{bmatrix} w_0\\ w_0 \\ \vdots\\ w_0 \end{bmatrix} \\
令b=⎣⎢⎢⎢⎡w0w0⋮w0⎦⎥⎥⎥⎤
则
X
w
=
[
w
0
+
∑
j
=
1
d
x
1
j
w
0
+
∑
j
=
1
d
x
2
j
⋮
w
0
+
∑
j
=
1
d
x
n
j
]
=
[
y
1
~
y
2
~
⋮
y
n
~
]
∴
X
w
−
y
=
[
y
1
~
−
y
1
y
2
~
−
y
2
⋮
y
n
~
−
y
n
]
则 Xw= \begin{bmatrix} w_0+\sum_{j=1}^dx_{1j}\\ w_0+\sum_{j=1}^dx_{2j}\\ \vdots\\ w_0+\sum_{j=1}^dx_{nj} \end{bmatrix} = \begin{bmatrix} \tilde{y_1}\\ \tilde{y_2}\\ \vdots\\ \tilde{y_n} \end{bmatrix} \\ ∴Xw-y=\begin{bmatrix} \tilde{y_1} - y_1\\ \tilde{y_2} - y_2\\ \vdots\\ \tilde{y_n} - y_n \end{bmatrix} \\
则Xw=⎣⎢⎢⎢⎢⎡w0+∑j=1dx1jw0+∑j=1dx2j⋮w0+∑j=1dxnj⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎡y1~y2~⋮yn~⎦⎥⎥⎥⎤∴Xw−y=⎣⎢⎢⎢⎡y1~−y1y2~−y2⋮yn~−yn⎦⎥⎥⎥⎤
最
后
:
l
=
∣
∣
X
w
−
y
∣
∣
2
2
=
(
y
1
~
−
y
1
)
2
+
(
y
2
~
−
y
2
)
2
+
⋯
+
(
y
n
~
−
y
n
)
2
=
∣
∣
X
w
−
y
∣
∣
2
2
(
L
2
范
数
的
平
方
写
法
)
最后:l = ||Xw-y||_2^2 = (\tilde{y_1} - y_1)^2+(\tilde{y_2} - y_2)^2+\cdots+(\tilde{y_n} - y_n)^2 = ||Xw-y||_2^2 \ \ \ \ (L2范数的平方写法)
最后:l=∣∣Xw−y∣∣22=(y1~−y1)2+(y2~−y2)2+⋯+(yn~−yn)2=∣∣Xw−y∣∣22 (L2范数的平方写法)
有了目标函数,就可以通过优化算法找让目标函数最小的 w w w了。
跟一元线性回归类似,首先需要把导数设置为0,之后在求解它的极值点。但需要用到向量的求导法则。
多元线性回归的解析解
求解参数
w
w
w,使得
l
=
∣
∣
X
w
−
y
∣
∣
2
2
l=||Xw-y||_2^2
l=∣∣Xw−y∣∣22最小
l
=
∣
∣
X
w
−
y
∣
∣
2
2
=
(
X
w
−
y
)
T
(
X
w
−
y
)
=
(
(
X
w
)
T
−
y
T
)
(
X
w
−
y
)
=
(
w
T
X
T
−
y
T
)
(
X
w
−
y
)
=
w
T
X
T
X
w
−
w
T
X
T
y
−
y
T
X
w
+
y
T
y
此
时
由
于
:
w
T
X
T
y
=
(
y
T
X
w
)
T
且
w
T
为
(
1
,
d
+
1
)
维
矩
阵
,
X
T
为
(
d
+
1
,
n
)
维
矩
阵
,
y
为
(
n
,
1
)
维
矩
阵
,
故
w
T
X
T
y
为
常
数
,
故
:
w
T
X
T
y
=
y
T
X
w
此
时
:
l
=
w
T
X
T
X
w
−
2
w
T
X
T
y
+
y
T
y
对
w
求
导
:
∂
l
∂
w
=
2
X
T
X
w
−
2
w
T
X
T
y
+
y
T
y
=
0
得
到
:
X
T
X
w
=
X
T
y
所
以
:
w
=
(
X
T
X
)
−
1
X
T
y
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ l=||Xw-y||_2^2 = (Xw-y)^T(Xw-y)\\ =((Xw)^T -y^T)(Xw-y)\\ =(w^TX^T-y^T)(Xw-y)\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =w^TX^TXw-w^TX^Ty-y^TXw+y^Ty \\ 此时由于:\ \ \ \ \ \ \ \ \ w^TX^Ty=(y^TXw)^T \\ 且 w^T为(1,d+1)维矩阵,X^T为(d+1,n)维矩阵,y为(n,1)维矩阵,故 w^TX^Ty为常数,故: \\ w^TX^Ty=y^TXw \\ 此时:l=w^TX^TXw-2w^TX^Ty+y^Ty \\ 对w求导:\frac{\partial l}{\partial w} = 2X^TXw-2w^TX^Ty+y^Ty = 0\\ 得到:X^TXw=X^Ty\\ 所以:w=(X^TX)^{-1}X^Ty
l=∣∣Xw−y∣∣22=(Xw−y)T(Xw−y)=((Xw)T−yT)(Xw−y)=(wTXT−yT)(Xw−y) =wTXTXw−wTXTy−yTXw+yTy此时由于: wTXTy=(yTXw)T且wT为(1,d+1)维矩阵,XT为(d+1,n)维矩阵,y为(n,1)维矩阵,故wTXTy为常数,故:wTXTy=yTXw此时:l=wTXTXw−2wTXTy+yTy对w求导:∂w∂l=2XTXw−2wTXTy+yTy=0得到:XTXw=XTy所以:w=(XTX)−1XTy
解析解(Analytical Solution):对于多元线性回归的目标函数,通过求导的方式直接求出了对应的最优参数。
注意:的一点是,并不是所有的目标函数我们都可以通过把导数设置为0的方式来求出极值点的,最经典的例子是逻辑回归
线性回归中的参数 w w w:通过参数 w j w_j wj我们可以看出第j个特征对结果的影响。例如:某一特征的参数 w j w_j wj为整数,则该特征对结果的影响为正向的,反之则为负向的。
手动实现多元线性回归模型
# 手动实现多远线性回归模型
import numpy as np
from sklearn.linear_model import LinearRegression
# 生成样本数据,特征维度为2
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# 此时线性回归模型为 有y = 1 * x_0 + 2 * x_2 +3
y = np.dot(X,np.array([1,2])) + 3
# 先使用sklearn库来解决
# 实例化线性回归模型
regr = LinearRegression()
model = regr.fit(X, y)
# 打印参数以及偏移量
print("基于sklearn的线性回归的参数估计 coef:",model.coef_,"intercept: %.5f" %model.intercept_)
# 手动实现多元线性回归的参数估计,把最后的结果放在res变量里,res[0]存储的是偏移量,res[1:]存储的是模型参数。
# 在X的第一列添加 一列[1,1,1,1],为了与w0相乘,代表b(偏移量)
ones = np.ones(4).reshape(-1,1)
X = np.concatenate((ones,X), axis=1)
# X的转置
X_inverse = X.T
# X转置与X相乘的逆
XTX_1 = np.linalg.inv(np.dot(X_inverse, X))
temp = np.dot(XTX_1,X_inverse)
res = np.dot(temp,y)
# 打印参数以及偏移量(bias)
print("通过手动实现的线性回归模型参数为 coef:",res[1:], "intercept: %.5f" %res[0])
在X的第一列添加 一列[1,1,1,1],为了与w0相乘,代表b(偏移量)
ones = np.ones(4).reshape(-1,1)
X = np.concatenate((ones,X), axis=1)
# X的转置
X_inverse = X.T
# X转置与X相乘的逆
XTX_1 = np.linalg.inv(np.dot(X_inverse, X))
temp = np.dot(XTX_1,X_inverse)
res = np.dot(temp,y)
# 打印参数以及偏移量(bias)
print("通过手动实现的线性回归模型参数为 coef:",res[1:], "intercept: %.5f" %res[0])
平方误差与高斯噪声
模型与误差
线性回归的最小二乘是基于高斯误差的假设得来的。
假设样本有一百万个,每个样本的预测值与真实值的误差,根据中心极限定理,该误差
ε
\varepsilon
ε服从高斯分布:
线
性
回
归
模
型
为
:
y
=
w
T
X
+
b
+
ε
假
设
我
们
定
义
的
数
据
集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
,
其
中
x
i
∈
R
d
,
N
是
样
本
总
数
,
d
是
特
征
维
度
:
y
1
=
w
T
X
+
b
+
ε
1
y
2
=
w
T
X
+
b
+
ε
2
⋮
y
N
=
w
T
X
+
b
+
ε
N
上
述
ε
∼
N
(
0
,
σ
2
)
其
中
均
值
为
零
是
因
为
有
些
误
差
是
正
向
的
有
些
误
是
负
向
的
,
故
我
们
认
为
均
值
为
零
。
ε
为
一
个
随
机
变
量
。
线性回归模型为:y=w^TX+b+\varepsilon\\假设我们定义的数据集D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\},其中x_i∈R^d,N是样本总数,d是特征维度:\\y_1=w^TX+b+\varepsilon_1\\y_2=w^TX+b+\varepsilon_2\\\vdots\\y_N=w^TX+b+\varepsilon_N\\上述\varepsilon\sim N(0,\sigma^2)\\其中均值为零是因为有些误差是正向的有些误是负向的,故我们认为均值为零。\varepsilon为一个随机变量。
线性回归模型为:y=wTX+b+ε假设我们定义的数据集D={(x1,y1),(x2,y2),⋯,(xN,yN)},其中xi∈Rd,N是样本总数,d是特征维度:y1=wTX+b+ε1y2=wTX+b+ε2⋮yN=wTX+b+εN上述ε∼N(0,σ2)其中均值为零是因为有些误差是正向的有些误是负向的,故我们认为均值为零。ε为一个随机变量。
样本的似然概率
线 性 回 归 模 型 : y = w T X + b + ε ε ∼ N ( 0 , σ 2 ) 根 据 高 斯 分 布 的 性 质 y ∼ N ( w T X + b , σ 2 ) 针 对 于 样 本 ( x i , y i ) , P ( y i ∣ x i ) ∼ N ( w T x i + b , σ 2 ) = 1 2 π σ e − ( w T X + b − y i ) 2 2 σ 2 线性回归模型:y=w^TX+b+\varepsilon\ \ \ \ \ \varepsilon \sim N(0,\sigma^2)\\ 根据高斯分布的性质 y \sim N(w^TX+b,\sigma^2)\\ 针对于样本(x_i,y_i),P(y_i|x_i) \sim N(w^Tx_i+b,\sigma^2) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(w^TX+b-y_i)^2}{2\sigma^2}} 线性回归模型:y=wTX+b+ε ε∼N(0,σ2)根据高斯分布的性质y∼N(wTX+b,σ2)针对于样本(xi,yi),P(yi∣xi)∼N(wTxi+b,σ2)=2πσ1e−2σ2(wTX+b−yi)2
所有样本的似然概率
由 上 可 知 , 每 个 样 本 的 条 件 概 率 为 : ∏ i = 1 N P ( y i ∣ x i ) = ∏ i = 1 N 1 2 π σ e − ( w T X + b − y i ) 2 2 σ 2 w ∗ , b ∗ = a r g m a x w , b ∏ i = 1 N 1 2 π σ e − ( w T X + b − y i ) 2 2 σ 2 由 于 当 条 件 概 率 的 值 越 大 , 预 测 值 越 准 确 , 故 我 们 求 当 条 件 概 率 最 大 化 是 的 w , b 的 值 。 为 了 方 便 计 算 , w ∗ , b ∗ = l o g ( a r g m a x w , b ∏ i = 1 N 1 2 π σ e − ( w T X + b − y i ) 2 2 σ 2 ) = a r g m a x w , b ∑ i = 1 N l o g [ 1 2 π σ e − ( w T X + b − y i ) 2 2 σ 2 ) ] = a r g m a x w , b ∑ i = 1 N { − l o g ( 2 π σ ) − ( w T X + b − y i ) 2 2 σ 2 ) } = a r g m a x w , b ∑ i = 1 N { − ( w T X + b − y i ) 2 2 σ 2 ) } ( 由 于 − l o g ( 2 π σ ) 为 常 量 , 不 影 响 后 续 对 w , b 的 取 值 , 故 可 以 舍 去 ) = a r g m a x w , b ∑ i = 1 N { − ( w T X + b − y i ) 2 ) } ( 由 于 分 子 2 σ 2 也 为 常 量 , 故 也 可 以 舍 去 ) = a r g m i n w , b ( w T X + b − y i ) 2 ( 去 掉 负 号 将 最 大 化 问 题 简 化 为 最 小 化 问 题 ) 由上可知,每个样本的条件概率为:\\\prod_{i=1}^N P(y_i|x_i)=\prod_{i=1}^N\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(w^TX+b-y_i)^2}{2\sigma^2}} \\w^*,b^* = argmax_{w,b}\prod_{i=1}^N\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(w^TX+b-y_i)^2}{2\sigma^2}} \\由于当条件概率的值越大,预测值越准确,故我们求当条件概率最大化是的w,b的值。\\为了方便计算,w^*,b^* = log(argmax_{w,b}\prod_{i=1}^N\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(w^TX+b-y_i)^2}{2\sigma^2}})\\= argmax_{w,b}\sum_{i=1}^Nlog[\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(w^TX+b-y_i)^2}{2\sigma^2}})]\\=argmax_{w,b}\sum_{i=1}^N\{-log(\sqrt{2\pi}\sigma)-{\frac{(w^TX+b-y_i)^2}{2\sigma^2}})\} \\=argmax_{w,b}\sum_{i=1}^N\{-{\frac{(w^TX+b-y_i)^2}{2\sigma^2}})\} \ \ \ \ (由于-log(\sqrt{2\pi}\sigma)为常量,不影响后续对w,b的取值,故可以舍去)\\=argmax_{w,b}\sum_{i=1}^N\{-{(w^TX+b-y_i)^2})\} \ \ \ \ (由于分子2\sigma^2也为常量,故也可以舍去)\\=argmin_{w,b}(w^TX+b-y_i)^2 \ \ \ \ \ \ \ (去掉负号将最大化问题简化为最小化问题) 由上可知,每个样本的条件概率为:i=1∏NP(yi∣xi)=i=1∏N2πσ1e−2σ2(wTX+b−yi)2w∗,b∗=argmaxw,bi=1∏N2πσ1e−2σ2(wTX+b−yi)2由于当条件概率的值越大,预测值越准确,故我们求当条件概率最大化是的w,b的值。为了方便计算,w∗,b∗=log(argmaxw,bi=1∏N2πσ1e−2σ2(wTX+b−yi)2)=argmaxw,bi=1∑Nlog[2πσ1e−2σ2(wTX+b−yi)2)]=argmaxw,bi=1∑N{−log(2πσ)−2σ2(wTX+b−yi)2)}=argmaxw,bi=1∑N{−2σ2(wTX+b−yi)2)} (由于−log(2πσ)为常量,不影响后续对w,b的取值,故可以舍去)=argmaxw,bi=1∑N{−(wTX+b−yi)2)} (由于分子2σ2也为常量,故也可以舍去)=argminw,b(wTX+b−yi)2 (去掉负号将最大化问题简化为最小化问题)
注意:不同的误差模型得出的结果是不同的,上述讨论的为误差模型为高斯分布时的情况。
以上推导可以得出,当我们把误差分布假定为高斯分布时,最终得出来的所有样本的似然函数其实就是开始讨论的平方误差。这种分析的方法也叫做概率解释(Probabilistic Interpretation)的方法。