当前位置: 首页 > article >正文

深度学习笔记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

矩阵表示线性回归 

         基于迭代的梯度下降算法会通过一轮轮的迭代,解决线性回归问题,求出J(\theta)取得最小值时,h_{\theta}(x)=\theta_{0}+\theta_{1}x_{1}+...+\theta_{n}x_{n}\theta的值。

        关于线性回归的另外的求解思路,是基于多元函数求极值的数学方法,求解参数\theta,在这个过程中,需要求解出J(\theta)关于\theta_{0},\theta_{1},..\theta_{n}的偏导数,然后令所有偏导数等于0,然后求出参数\theta的值。这个方法最终会推导出一个关于\theta的公式:

\theta=(X^{T}X)^{-1}X^{T}y

\theta=\begin{bmatrix} \theta_{0}\\ \theta_{1}\\ \theta_{2}\\ ...\\\theta_{n} \end{bmatrix}

X=\begin{bmatrix} 1 &x_{11} &x_{12} &... &x_{1n} \\ 1 &x_{21} &x_{22} &... &x_{2n} \\ ...& ... & ... &... &... \\ 1 &x_{m1} &x_{m2} &... &x_{mn} \end{bmatrix}

y=\begin{bmatrix} y_{1}\\ y_{2}\\ ...\\ y_{m} \end{bmatrix}

h_{\theta}(x)可以表示为:

h_{\theta}(x)=X\theta=\begin{bmatrix} \theta_{0}+\theta_{1}x_{11}+...+\theta_{n}x_{1n}\\ \theta_{0}+\theta_{1}x_{21}+...+\theta_{n}x_{2n}\\ ......\\ \theta_{0}+\theta_{1}x_{m1}+...+\theta_{n}x_{mn} \end{bmatrix}=\begin{bmatrix} h_{1}\\ h_{2}\\ ...\\ h_{m} \end{bmatrix}

J(\theta) 矩阵表示形式:

J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}\left [ h_{\theta}(x_{i})-y_{i} \right ]^{2}=\frac{1}{2m}(y-X\theta)^{T}(y-X\theta)

        求出J(\theta)取得最小值时,参数\theta的值为最优解,用\theta^{*}表示

\theta^{*}=\arg min(y-X\theta)^{T}(y-X\theta)

min代表求最小值,arg代表函数达到最小值时,参数\theta的值

最小二乘法 

        最小二乘法的公式:\theta=(X^{T}X)^{-1}X^{T}y

推到过程:

        \frac{\partial (y-X\theta)^{T}(y-X\theta)}{\partial \theta}=\frac{\partial y^{T}y}{\partial \theta}-\frac{\partial y^{T}X\theta}{\partial \theta}-\frac{\partial \theta^{T}X^{T}y}{\partial \theta}+\frac{\partial \theta^{T}X^{T}X\theta}{\partial \theta}

=-2X^{T}y+2X^{T}X\theta

矩阵求导公式:

\frac{\mathrm{d} AX}{\mathrm{d} A}=A^{T}

\frac{\mathrm{d} X^{T}A}{\mathrm{d} X}=A

\frac{\mathrm{d} X^{T}AX}{\mathrm{d} X}=(A+A^{T})X

移项化简后即可得到 :\theta=(X^{T}X)^{-1}X^{T}y

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()))

矩阵不可逆 

        多元线性回归中,(X^{T}X)^{-1}出现不可逆的原因:

  1. 在特征向量中,包括了线性相关的特征,特征值之间有线性换算的关系
  2. 训练样本过少,或者描述样本的特征太多了。样本数量小于或等于特征值的数量

        避免矩阵不可逆的情况:

  1. 寻找问题的关键特征
  2. 将多余无效的特征删去
  3. 通过对特征提取的优化,提升模型训练效果

梯度下降法和最小二乘法对比

         从代码实现角度看,最小二乘法实现简单,梯度下降算法需要考虑初始化、迭代速率、迭代次数等参数,并且要设置多轮次循环迭代。虽然梯度下降算法实现相对复杂,但它可以轻松处理较大规模数量的样本,实际应用场景更广泛,不需要考虑逆矩阵是否存在,容错性更强。

        梯度下降算法时间复杂度:O(tmn),t为迭代次数

        最小二乘法时间复杂度:O(n^{2}m+n^{3})


http://www.kler.cn/a/379379.html

相关文章:

  • gradlew.cmd的使用
  • Session条件竞争--理论
  • 设备搜索相关协议使用
  • SpringKafka生产者、消费者消息拦截
  • Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问
  • CSS--两列网页布局,三列布局和多行多列布局
  • 享元模式-实现大颗粒度对象缓存机制
  • Cesium移动3D模型位置
  • docker desktop使用ubuntu18.04带图形化+运行qemu
  • 划界与分类的艺术:支持向量机(SVM)的深度解析
  • metasploit/modules/evasion 有哪些模块,以及具体使用案例
  • WebService详解
  • 服务器数据恢复—SAN环境中LUN映射错误导致文件系统一致性出错的数据恢复案例
  • 【neo4j】 图数据库neo4j cypher单一语句 optional 可选操作的技巧
  • “代码世界的必修课:Git完整指南“(3)
  • JVM基本结构和垃圾回收机制
  • 小白从零开始学c++之继承对象的内存空间
  • nodejs入门教程8:nodejs EventEmitter
  • 《Java 实现希尔排序:原理剖析与代码详解》
  • 三维测量与建模笔记 - 2.2 射影几何
  • Hive数据库操作语法
  • Java-I/O框架10:File类、文件操作
  • docker部署Flask+Vue3项目
  • Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题
  • C++游戏开发前景讨论
  • [算法初阶]第二集 滑动窗口(已完结)