机器学习算法 | 最小二乘法

目录

一、矩阵的基础知识点

二、矩阵的求导

三、投影矩阵

四、最小二乘法

五、应用(糖尿病数据集)


一、矩阵的基础知识点

1.矩阵与向量

矩阵n*n   例如: \begin{bmatrix} 1& 2& \\ 3& 4& \\ 5& 6& \end{bmatrix} 3x2(row x column)  R^{3x2}  其中:A_{11}=1

向量n*1   例如:y=\begin{bmatrix} 1\\ 2\\ 3\\ 4 \end{bmatrix} nx1  其中:y_{1}=1

2.矩阵x向量=向量

\begin{bmatrix} 1 & 1000\\ 1& 2000\\ 1& 3000\\ 1& 4000 \end{bmatrix} x \begin{bmatrix} -40\\ 0.25 \end{bmatrix} =\begin{bmatrix} x1\\ x2\\ x3\\ x4 \end{bmatrix}

过程:1x(-40)+1000x0.25=x1

1x(-40)+2000x0.25=x2(x3,x4同理)

3.矩阵x矩阵=矩阵

A(mxn) x B (nxo) = C (mxo)

\begin{bmatrix} 1 & 1000\\ 1& 2000\\ 1& 3000\\ 1& 4000 \end{bmatrix} x \begin{bmatrix} -40 & 200\\ 0.25&0.1 \end{bmatrix}\begin{bmatrix} a_{11} &a_{12}\\ a_{21} &a_{22}\\ a_{31} &a_{32}\\ a_{41} &a_{42} \end{bmatrix}

过程:1x(-40)+1000x0.25=a11

           1x(-40)+2000x0.25=a21(a31,a41同理)

           1x200+1000x0.1=a12

           1x200+2000x0.1=a22(a32,a42同理)

相当于分别求矩阵B的列,再合并

4.乘法规律

交换律x        即:AxB ≠ BxA

结合律√        即:(AxB)xC = Ax(BxC)

5.单位矩阵I(I_{n*n}

I=\begin{bmatrix} 1 & 0\\ 0& 1 \end{bmatrix} \begin{bmatrix} 1 & 0& 0\\ 0 & 1& 0\\ 0& 0 & 1 \end{bmatrix}

即斜对角线为1,其余为0

AxI=IxA=A

6.逆矩阵

A为方阵(n*n)

A*A^{-1}=A^{-1}*A=I

7.转置

A=\begin{bmatrix} 1 & 2&0 \\ 3& 5&9 \end{bmatrix} 从第一个向右下45°画一条线,然后翻转

B=A^{T}=\begin{bmatrix} 1 & 3\\ 2 & 5\\ 0 & 9 \end{bmatrix}

 B_{ji}=A_{ij}

二、矩阵的求导

1.本质

\frac{dA}{dB}=矩阵A中的每一个元素对矩阵B中的每一个元素求导

2.求导技巧

①标量不变,向量拉伸

②前面横向拉,后面纵向拉

机器学习算法 | 最小二乘法_第1张图片

3.两个求导公式

3.1 \frac{\partial }{\partial x}A^{T}X=A 

机器学习算法 | 最小二乘法_第2张图片

3.2\frac{\partial }{\partial x}X^{T}AX=(A+A^{T})X

机器学习算法 | 最小二乘法_第3张图片

4.细节补充

4.1两种布局

4.1.1

分母布局→YX拉伸术

分子布局→XY拉伸术

4.1.2区别在于求导后元素排列不同

4.1.3通常:分母布局的转置=分子布局

4.2矩阵求导的乘法与加法公式

U^{n+1}  V^{n+1}  X^{n+1}

4.2.1乘法公式

\frac{dU^{T}V}{dx}=\frac{dU}{dx}V+\frac{dV}{dx}U

4.2.2加法公式

\frac{d(U+V)}{dx}=\frac{dU}{dx}+\frac{dV}{dx}

三、投影矩阵

1.为什么需要投影

因为Ax=b可能无解,因为Ax一定是在x的列空间中,可是b不一定

解决方法就是找到b在Ax的投影,寻找最接近的解A\hat{x}=p(p为b的投影)

2.一维

机器学习算法 | 最小二乘法_第4张图片

p=xa

a^{T}(b-xa)=0

 a^{T}b=xa^{T}a

 x=\frac{a^{T}b}{a^{T}a}

投影 p=a\frac{a^{T}b}{a^{T}a}

投影矩阵P=\frac{aa^{T}}{a^{T}a}

3.n维

机器学习算法 | 最小二乘法_第5张图片

4.性质

4.1用任何向量b乘以这个矩阵都回到他的列空间

C(P)投影矩阵P的列空间=通过a的线

rank(P)=1

4.2对称

P^{T}=P

4.3投影两次不变

P^{2}=P

四、最小二乘法

1.公式推导

机器学习算法 | 最小二乘法_第6张图片

2.几何意义

2.1最优直线

机器学习算法 | 最小二乘法_第7张图片

2.2投影矩阵的理解

机器学习算法 | 最小二乘法_第8张图片

五、应用(糖尿病数据集)

1.前期

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore')

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 导包获取糖尿病数据集
from sklearn.datasets import load_diabetes  
data_diabetes = load_diabetes()

data = data_diabetes['data']
target = data_diabetes['target']
feature_names = data_diabetes['feature_names']

df = pd.DataFrame(data,columns=feature_names)
df.head()

机器学习算法 | 最小二乘法_第9张图片

df.info()

 机器学习算法 | 最小二乘法_第10张图片

 

2.手写算法

#手动切分数据集
x_train=df.iloc[0:354]
y_train=pd.DataFrame(target,columns=['target']).iloc[0:354]
x_test=df.iloc[354:]
y_test=pd.DataFrame(target,columns=['target']).iloc[354:]

#最小二乘法
def LRegression(X,Y):
    #w=(XT*X)^(-1)* XT*Y
    XTX=np.dot(X.T,X)
    if np.linalg.det(XTX)==0:
        print('This matrix cannot be inverse')
        return
    w=np.dot(np.linalg.inv(XTX),np.dot(X.T,Y))
    return w

LRegression(x_train,y_train)

运行结果:
array([[   54.70255153],
       [ -272.72206257],
       [  442.16760619],
       [  343.83905862],
       [-1200.00662612],
       [  765.10258764],
       [  348.05832353],
       [  363.51975937],
       [  857.37409665],
       [   22.50417733]])

3.sklearn的效果对比

def sk_LRegression(data,target):
    #抽取训练集&测试集
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.2)

    #建立模型
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
    model.fit(x_train,y_train)

    w_array = model.coef_ #返回每一维的权重值
    b=model.intercept_ #截距

    #评估模型
    print(model.score(x_train,y_train))
    print(w_array)
    print(b)
    return

sk_LRegression(data,target)

运行结果:
0.5091774777893477
[ -60.06160915 -166.61973713  533.0275304   327.96835194 -931.41769066
  562.91257525  172.56818713  147.88826342  829.50104026   22.6835442 ]
152.8837928410518

你可能感兴趣的:(机器学习,最小二乘法)