深度学习笔记7-最小二乘法
求解逆矩阵
#计算矩阵的逆矩阵
import numpy as np#直接使用numpy中的接口
#定义矩阵A
A=np.array([[3,1],[5,9]])
#调用inv接口,计算矩阵的逆矩阵
A_inv=np.linalg.inv(A)
#打印结果
print(A_inv)
运行结果:
[[ 0.40909091 -0.04545455]
[-0.22727273 0.13636364]]
Process finished with exit code 0
矩阵表示线性回归
基于迭代的梯度下降算法会通过一轮轮的迭代,解决线性回归问题,求出取得最小值时,中的值。
关于线性回归的另外的求解思路,是基于多元函数求极值的数学方法,求解参数,在这个过程中,需要求解出关于的偏导数,然后令所有偏导数等于0,然后求出参数的值。这个方法最终会推导出一个关于的公式:
则可以表示为:
矩阵表示形式:
求出取得最小值时,参数的值为最优解,用表示
min代表求最小值,arg代表函数达到最小值时,参数的值
最小二乘法
最小二乘法的公式:
推到过程:
矩阵求导公式:
移项化简后即可得到 :
python实现最小二乘法
使用numpy数组
调用numpy的库函数进行计算
import numpy as np
#函数传入特征向量矩阵和标签列向量y
def normal_equation_array(X,y):
XT=np.transpose(X)#调用transpose计算矩阵X的转置
XTX=np.dot(XT,X)#调用dot计算X转置乘以X
det=np.linalg.det(XTX)#计算XTX的行列式
#行列式不为0,才可以求逆矩阵
if det==0:
return 'error'
XTX_inv=np.linalg.inv(XTX)#计算XTX的逆矩阵
XTy=np.dot(XTX,y)#计算X转置和y相乘
theta=np.dot(XTX_inv,XTy)
return theta
使用numpy数组转为矩阵对象
#直接使用numpy中的矩阵类
def normal_equation_matrix(X,y):
#将数组X和y转换为矩阵
X=np.mat(X)
y=np.mat(y)
#矩阵X可以直接调用X.T获得X的转置
XTX=X.T*X#矩阵相乘直接使用*
det=np.linalg.inv(XTX)
if det==0.0
return 'error'
theta=XTX.I*X.T*y
return theta
主程序调用
if __name__=='__main__':
#设置特征向量矩阵X、y
...
#测试两个函数,求出theta
theta=normal_equation_array(X,y)
print(theta)
theta=normal_equation_matrix(X,y)
print(theta)
#计算代价函数J
costJ=(y-X*theta).T*(y-X*theta)/(2*len(y))
print("Cost J is %lf"%(costJ.item()))
#预测两个样本的结果
test1=[]
test2=[]
#打印两个测试样本的结果
print('test1=%.3f'%((test1*theta).item()))
print('test2=%.3f'%((test2*theta).item()))
矩阵不可逆
多元线性回归中,出现不可逆的原因:
- 在特征向量中,包括了线性相关的特征,特征值之间有线性换算的关系
- 训练样本过少,或者描述样本的特征太多了。样本数量小于或等于特征值的数量
避免矩阵不可逆的情况:
- 寻找问题的关键特征
- 将多余无效的特征删去
- 通过对特征提取的优化,提升模型训练效果
梯度下降法和最小二乘法对比
从代码实现角度看,最小二乘法实现简单,梯度下降算法需要考虑初始化、迭代速率、迭代次数等参数,并且要设置多轮次循环迭代。虽然梯度下降算法实现相对复杂,但它可以轻松处理较大规模数量的样本,实际应用场景更广泛,不需要考虑逆矩阵是否存在,容错性更强。
梯度下降算法时间复杂度:O(tmn),t为迭代次数
最小二乘法时间复杂度: