《机器学习》笔记:第三章线性模型(Python代码实现)未完成

3.1 基本形式

给定由 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=x11x21xm1x12x22xm2x1dx2dxmd111=x1Tx2TxdT111,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 ω可以描述属性的重要程度,所以利用线性模型可以建立一个解释性很好的预测模型。

3.2 线性回归

属性类型 处理方式
连续型 不做处理
离散型 有序则按序赋值
离散型 无序则"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=1m(f(xi)yi)2=(ω,b)argmini=1m(yiωxib)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=1mxi2m1(i=1mxi)2i=1myi(xixˉ)

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=1m(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(yXω^)T(yXω^).

同样的求导可得:
ω ^ ∗ = ( 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()#显示

《机器学习》笔记:第三章线性模型(Python代码实现)未完成_第1张图片
《机器学习》笔记:第三章线性模型(Python代码实现)未完成_第2张图片

你可能感兴趣的:(机器学习,python,机器学习)