目录
一、矩阵的基础知识点
二、矩阵的求导
三、投影矩阵
四、最小二乘法
五、应用(糖尿病数据集)
1.矩阵与向量
矩阵n*n 例如: 3x2(row x column) 其中:=1
2.矩阵x向量=向量
过程:1x(-40)+1000x0.25=x1
1x(-40)+2000x0.25=x2(x3,x4同理)
3.矩阵x矩阵=矩阵
A(mxn) x B (nxo) = C (mxo)
过程: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()
即斜对角线为1,其余为0
AxI=IxA=A
6.逆矩阵
A为方阵(n*n)
7.转置
1.本质
2.求导技巧
①标量不变,向量拉伸
②前面横向拉,后面纵向拉
3.两个求导公式
4.细节补充
4.1两种布局
4.1.1
分母布局→YX拉伸术
分子布局→XY拉伸术
4.1.2区别在于求导后元素排列不同
4.1.3通常:分母布局的转置=分子布局
4.2矩阵求导的乘法与加法公式
4.2.1乘法公式
4.2.2加法公式
1.为什么需要投影
因为Ax=b可能无解,因为Ax一定是在x的列空间中,可是b不一定
解决方法就是找到b在Ax的投影,寻找最接近的解(p为b的投影)
2.一维
3.n维
4.性质
4.1用任何向量b乘以这个矩阵都回到他的列空间
C(P)投影矩阵P的列空间=通过a的线
rank(P)=1
4.2对称
4.3投影两次不变
1.公式推导
2.几何意义
2.1最优直线
2.2投影矩阵的理解
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()
df.info()
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