1.前边我们说了几种常用的回归方法,他们虽然实现的方式不一样,但是思想几乎都是一样的-使用已经直到的函数来逼近问题,然后用这个逼近函数来近似的作为问题的解。我们知道,在使用梯度下降法来做回归的时候,我们有一个学习率的概念,然后再这个基础上,我们通过一次次的迭代来寻找全局最优解,梯度下降这个概念体现在我们再求解最有解的时候,当前解的转移是通过当前点的导数来寻找下一步的转移方向,叫做梯度下降,沿着梯度来下降。然后,我们也可以通过另外一种方法来求解回归方程。这是和之前基于逼近理论的回归是不同的概念。标准方程是利用矩阵的知识来解决问题的,我在这里叙述一下其中原理,假设一个问题又n个影响的因素,这个时候我们要使用多元线性回归来解决这个问题,假设我们使用的是梯度下降法,得到了一个类似与这样的式子:【机器学习】标准方程法_权重.这是一个多元函数,我们可以通过这种方式确定a1,a2..an。也就是系数,其实我们可以把他们叫做权重,解释一下也就是每个因子对这个问题影响的权重。这个权重的求取是我们一步一步逼近的,但是我们从另外一个观点来看待这个问题:假设我们有一个n*n的矩阵,这个矩阵代表着每个因子具体的值,比如有一个关于身高预测的模型,其中一个人的身高的影响因素有:父亲升高,母亲升高,以及自己年龄的大小。写成一个矩阵也就是:

                                                                                      【机器学习】标准方程法_数据_02

看到这个简单的矩阵,其中每一行代表一组数据,每一行中的第一个数据是father的身高,第二行是mother的身高,第三行是孩子现在的年龄。直到了这些数据,我们有直到这些孩子的身高是:【机器学习】标准方程法_权重_03.现在我们需要做的事情就是通过这些数据来建立一个模型来预测father的身高,mother的身高已经孩子的年龄之间的关系。显然,从遗传学的角度来粗略的说,家长的身高对自己后代肯定会有或多或少的影响。这个时候我们可以设这三个影响因素的权值是w0,w1,w2.然后我们可以通过矩阵的乘法得到下边的式子: 【机器学习】标准方程法_权重_04*【机器学习】标准方程法_权重_05=【机器学习】标准方程法_数据_06.这个时候我们可以通过高斯消元得到w0,w1,w2的值。但是这并不是我们要求的。我们要求的是这样的一组:w0,w1,w2.使得预测值和真实值误差最小,其实表现在代价函数上也就是我们要对这个代价函数求导,在导函数求最值。这就涉及到比较深的数学知识了-矩阵的求导。这个其实和基本标量的求导区别不是很大,向量对标量求导一般都是叫做求偏导数。不太会的可以补一补这些。

2.直到了这些,我们来做一个简单的demo。首先还是数据:还是假设问题只有一个影响因子,我们的数据如下:

 

                             【机器学习】标准方程法_权值_07

我们首先把散点图画出来看看:

                        【机器学习】标准方程法_数据_08

这个数据看起来比较有特点,基本上是在一条直线附近。实现以下标准方程法求解:代码如下:

import numpy as np
import matplotlib.pyplot as plt
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
x_data=data[:,0,np.newaxis]
y_data=data[:,1,np.newaxis]
plt.scatter(x_data,y_data)
# plt.show()
# print(np.mat(x_data).shape)
# print(np.mat(y_data).shape)
X_data=np.concatenate((np.ones((14,1)),x_data),axis=1)
# print(X_data)
# 这里是求取权值的函数,我们传入两个矩阵。
def weights(xArr,yArr):
xMat=np.mat(xArr)
yMat=np.mat(yArr)
xTx=xMat.T*xMat
if(np.linalg.det(xTx)==0.0):
print("the matrix can`t do inverse")
return
ws=xTx.I*xMat.T*yMat
return ws
ws=weights(X_data,y_data)
# print(ws)
# 调用这个函数之后,我们就会得到相应的权值
# 在这里我们可以知道,得到了两个权值其实就是回归直线的截距和斜率。
# 那么我们产生一些数据把这条直线显示出来
x_test=np.array([[0],[300]])
y_test=ws[0]+x_test*ws[1]
plt.plot(x_test,y_test,'r')
plt.show()

执行程序之后得到效果:

【机器学习】标准方程法_权值_09

可以看到有很多的点都是落在了这条直线上,所以拟合性还是很好的。虽然标准方程法有着很高的准确性,但是从他的实现方式我们可以看出来,这个实现方式是基于矩阵理论实现的,里面有着很多的矩阵操作,例如矩阵的乘法,矩阵的求逆,这些操作基本上所依赖的算法的时间复杂度都是很高的。所以不使用于特征很多的数据。