给定由 d d d个属性描述的示例 x = ( x 1 ; x 2 ; ⋯ ; x d ) x=(x_1;x_2;\cdots;x_d) x=(x1;x2;⋯;xd),其中 x i x_i xi是 x x x在第 i i i个属性上的取值,线性模型通过属性间的线性组合进行预测:
f ( x ) = ω 1 x 1 + ω 2 x 2 + ⋯ + ω d x d + b f(x)=\omega_1x_1+\omega_2x_2+\cdots+\omega_dx_d+b f(x)=ω1x1+ω2x2+⋯+ωdxd+b
也可以用向量形式写成:
f ( x ) = ω T x + b f(x)=\omega^Tx+b f(x)=ωTx+b
其中 ω = ( ω 1 ; ω 2 ; ⋯ ; ω d ) \omega=(\omega_1;\omega_2;\cdots;\omega_d) ω=(ω1;ω2;⋯;ωd),只要确定 ω \omega ω和 b b b,即可确定模型。
另外也可以用矩阵的形式表示:
X = ( x 11 x 12 ⋯ x 1 d 1 x 21 x 22 ⋯ x 2 d 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m d 1 ) = ( x 1 T 1 x 2 T 1 ⋮ ⋮ x d T 1 ) , W = ( ω 1 ω 2 ⋯ ω d b ) X=\left( \begin{matrix} {{x}_{11}} & {{x}_{12}} & \cdots & {{x}_{1d}} & 1 \\ {{x}_{21}} & {{x}_{22}} & \cdots & {{x}_{2d}} & 1 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ {{x}_{m1}} & {{x}_{m2}} & \cdots & {{x}_{md}} & 1 \\ \end{matrix} \right)=\left( \begin{matrix} x_{1}^{T} & 1 \\ x_{2}^{T} & 1 \\ \vdots & \vdots \\ x_{d}^{T} & 1 \\ \end{matrix} \right),W={{\left( \begin{matrix} {{\omega }_{1}} & {{\omega }_{2}} & \cdots & {{\omega }_{d}} & b \\ \end{matrix} \right)}} X=⎝⎜⎜⎜⎛x11x21⋮xm1x12x22⋮xm2⋯⋯⋱⋯x1dx2d⋮xmd11⋮1⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛x1Tx2T⋮xdT11⋮1⎠⎟⎟⎟⎞,W=(ω1ω2⋯ωdb)
则
f ( x ) = X W ′ = ( ω 1 x 11 + ω 2 x 12 + ⋯ + ω d x 1 d + b ω 1 x 21 + ω 2 x 22 + ⋯ + ω d x 2 d + b ⋮ ω 1 x m 1 + ω 2 x m 2 + ⋯ + ω d x m d + b ) f(x)=XW^{\prime}=\left( \begin{matrix} {{\omega }_{1}}{{x}_{11}}+{{\omega }_{2}}{{x}_{12}}+\cdots +{{\omega }_{d}}{{x}_{1d}}+b \\ {{\omega }_{1}}{{x}_{21}}+{{\omega }_{2}}{{x}_{22}}+\cdots +{{\omega }_{d}}{{x}_{2d}}+b \\ \vdots \\ {{\omega }_{1}}{{x}_{m1}}+{{\omega }_{2}}{{x}_{m2}}+\cdots +{{\omega }_{d}}{{x}_{md}}+b \\ \end{matrix} \right) f(x)=XW′=⎝⎜⎜⎜⎛ω1x11+ω2x12+⋯+ωdx1d+bω1x21+ω2x22+⋯+ωdx2d+b⋮ω1xm1+ω2xm2+⋯+ωdxmd+b⎠⎟⎟⎟⎞
由于系数 ω \omega ω可以描述属性的重要程度,所以利用线性模型可以建立一个解释性很好的预测模型。
属性类型 | 处理方式 |
---|---|
连续型 | 不做处理 |
离散型 | 有序则按序赋值 |
离散型 | 无序则"One-Hot"编码处理 |
线性回归的目的是,令
f ( x i ) = ω x i + b f(x_i)=\omega x_i+b f(xi)=ωxi+b同时 f ( x i ) ≈ y i f(x_i) \approx y_i f(xi)≈yi
于是,只需要让 f ( x i ) f(x_i) f(xi)与 y i ∣ y_i| yi∣之间的差最小化即可,这里选择均方差作为性能指标(目标函数),即:
( ω ∗ , b ∗ ) = arg min ( ω , b ) ∑ i = 1 m ( f ( x i ) − y i ) 2 = arg min ( ω , b ) ∑ i = 1 m ( y i − ω x i − b ) 2 (\omega ^*,b^*)=\underset{(\omega ,b)}{\mathop{\arg \min }}\sum^{m}_{i=1}(f(x_i)-y_i)^2=\underset{(\omega ,b)}{\mathop{\arg \min }}\sum^{m}_{i=1}(y_i-\omega x_i-b)^2 (ω∗,b∗)=(ω,b)argmini=1∑m(f(xi)−yi)2=(ω,b)argmini=1∑m(yi−ωxi−b)2
直接对上式求导,即可得到 ω \omega ω和 x i x_i xi的求解公式。
ω = ∑ i = 1 m y i ( x i − x ˉ ) ∑ i = 1 m x i 2 − 1 m ( ∑ i = 1 m x i ) 2 \omega=\frac{\sum^{m}_{i=1}y_i(x_i- \bar{x})}{\sum^{m}_{i=1}x_i^2-\frac{1}{m}(\sum^{m}_{i=1}x_i)^2} ω=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)
b = 1 m ∑ i = 1 m ( y i − ω x i ) b=\frac{1}{m}\sum^{m}_{i=1}(y_i-\omega x_i) b=m1i=1∑m(yi−ωxi)
当然上式也可以写成矩阵的形式:
令 ω ^ = ( ω , b ) \hat \omega=(\omega,b) ω^=(ω,b), y = y 1 , y 2 , ⋯ , y m y=y_1,y_2,\cdots,y_m y=y1,y2,⋯,ym,则:
ω ^ ∗ = arg min ω ^ ( y − X ω ^ ) T ( y − X ω ^ ) \hat \omega^*=\underset{\hat \omega}{\mathop{\arg \min }}(y-X\hat \omega)^T(y-X\hat \omega) ω^∗=ω^argmin(y−Xω^)T(y−Xω^).
同样的求导可得:
ω ^ ∗ = ( X T X ) − 1 X T y \hat \omega^*=(X^TX)^{-1}X^Ty ω^∗=(XTX)−1XTy
f ( x ^ i ) = x ^ i T ( X T X ) − 1 X T y f(\hat x_i)=\hat x_i^T(X^TX)^{-1}X^Ty f(x^i)=x^iT(XTX)−1XTy
当 X T X X^TX XTX满秩时可以求出唯一解,否则可以求出多组解,一般通过正则化的方式选择。
# 加载包
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
class LinearRegression:
def weighted_hat(self,X,Y):
self.bias =np.ones(len(X))
X=np.c_[X,self.bias]
self.weight = np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)),X.T),Y)#权重及截距公式
self.bias = self.weight[-1]
self.weight=self.weight[0:-1]
return self.weight,self.bias
def predict(self,x):
return np.dot(x,self.weight)+self.bias
x=2*np.random.rand(500,3)#随机生成一个0-2之间的,大小为(500,1)的向量
y=5+3*x+np.random.randn(500,1)#随机生成一个线性方程的,大小为(500,1)的向量
fig=plt.figure(figsize=(8,6))#确定画布大小
plt.scatter(x,y)#设置为散点图
plt.title("Dataset")#标题名
plt.xlabel("First feature")#x轴的标题
plt.ylabel("Second feature")#y轴的标题
plt.show()#绘制出来
LR = LinearRegression()
weight,bia = LR.weighted_hat(x,y)
y_hat = LR.predict(x)
fig=plt.figure(figsize=(8,6))#设置画布大小
plt.scatter(x,y)#绘制训练集的散点图
plt.scatter(x,y_hat)#绘制测试集的散点图,注意这里的y_p_test是正态之后的测试集的y
plt.xlabel("First feature")#x轴的标题
plt.ylabel("Second feature")#y轴的标题
plt.show()#显示