标准方程法
在之前处理一元线性回归和多元线性回归的时候我们所使用处理代价函数的方法是梯度下降法,那么这里介绍一种新的方法叫做标准方程法,标准方程法更多的是去运用矩阵来进行数据处理和运算:
就是要求解曲线中最低的那个点,所以对代价函数求导为0解出θ0,θ1…
这是我们使用w代替θ成为权值,因为有五个数据,所以我们这里生成了五个权值。
这里我们使用矩阵代替了代价函数的形式,Xw相当于一个四行一列的矩阵每一行都是(x0w0+x1w1+x2w2+x3w3+x4w4) 这样的四行一列的数据,正好与y矩阵四行一列相匹配,那么y-Xw
就相当于是真实值减去预测值
,与我们代价函数括号内所表达的意思相同。矩阵形式的平方就相当于转置矩阵和原矩阵相乘,在这里就是 原矩阵(四行一列)
和 转置矩阵(一行四列)
乘出来就是一个数了
我们用向量表达出代价函数之后就可以开始进行求导了,对式子进行化简
这里要声明求导的时候我们要知道 求导的是 分子布局
还是分母布局
,因为不用的布局求导的方式不一样。
这四个式子的求导分别是:
上面的具体求导方法就是根据维基百科分子分母布局求导 里面的公式进行求导,大家自行进去查看。
求导之后我们为了找到那个最小值所以使得导数等于0,求出权值w的值,那么这样我们线性回归的参数就求出来了。
代码部分:
这里我们使用的数据集为一元线性回归,在那节我们使用的是梯度下降法,这里我们使用标准方程法:
首先还是导入包:
import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
导入数据:
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
plt.scatter(x_data,y_data)
plt.show()
在这里我们要给样本添加偏置项(就像上面数据第一列都为1一样):
X_data = np.concatenate((np.ones((100,1)),x_data),axis=1)
numpy.concatenate能够一次完成多个数组的拼接,axis=1表示对应行的数组进行拼接。一般axis默认为0.
构造标准方程函数:
# 标准方程法求解回归参数
def weights(xArr, yArr):
xMat = np.mat(xArr)
yMat = np.mat(yArr)
xTx = xMat.T*xMat # 矩阵乘法
# 计算矩阵的值,如果值为0,说明该矩阵没有逆矩阵
if np.linalg.det(xTx) == 0.0:
print("This matrix cannot do inverse")
return
# xTx.I为xTx的逆矩阵
ws = xTx.I*xMat.T*yMat
return ws
np.mat将np.array转换成矩阵
.I是返回原矩阵的逆矩阵
.T是返回原矩阵的转置矩阵
此时我们就计算出来ws了,之后就是画图了:
ws = weights(X_data,y_data)
x_test = np.array([[20],[80]])
y_test = ws[0] + x_test*ws[1]
plt.plot(x_data, y_data, 'b.')
plt.plot(x_test, y_test, 'r')
plt.show()
对于标准方程法注意的地方:
标准方程法并不是在任何地方都可以使用,当 矩阵不可逆
的时候,比如线性相关的特征具有多重共线性
或者特征的数据太多
,这时候就没办法使用,因为矩阵都不可逆,最后没办法求出w
梯度下降法和标准方程法的对比: