线性回归概述##
我们先考虑最简单的一种情况,即输入属性的数目只有一个,线性回归试图学得[1]
(1)
f
(
x
i
)
=
w
x
i
+
b
,
使
得
f
(
x
i
)
≈
y
i
f(x_i) = w x_i + b,使得f(x_i) \approx y_i \tag{1}
f(xi)=wxi+b,使得f(xi)≈yi(1)
那么如何确定
w
⃗
\vec{w}
w和b呢?关键在于如何衡量
f
(
x
⃗
)
f(\vec{x})
f(x)与y之间的差别。
均方误差是回归任务重最常用的性能度量,因此我们可以试图让均方误差最小化,即
\begin{equation}
(w^, b^) = \mathop{\arg\min}{(w, b)} \mathop{\sum}{i=1}^m (f(x_i) - y_i)^2 \tag{2}
\end{equation}
基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method)。
为了方便,我们这里用向量的形式来表达。令 $
\vec{w} =
\left[ \begin{array}{ccc}
w \
b \end{array} \right]
,
,
,\vec{x}_i =
\left[ \begin{array}{ccc}
x_i \
1 \end{array} \right]
,
则
,则
,则f(\vec{x}_i) = \vec{w}^T\vec{x}iKaTeX parse error: No such environment: equation at position 19: …(2)式可表示为 \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ (\vec{w}^*) =…E(\vec{w}) = \mathop{\sum}{i=1}^m (\vec{w}^T\vec{x}_i - y_i)^2
,
用
矩
阵
的
形
式
可
将
其
写
做
[
2
]
,用矩阵的形式可将其写做[2]
,用矩阵的形式可将其写做[2]KaTeX parse error: Expected 'EOF', got '\matrix' at position 25: …) = (\vec{y} - \̲m̲a̲t̲r̲i̲x̲{X}\vec{w})^T(\…$ 其中$\vec{y} =
\left[
\begin{matrix}
y_1 \
y_2 \
\vdots \
y_m
\end{matrix}
\right],
\matrix{X} =
\left[
\begin{matrix}
x_1 & 1\
x_2 & 1\
\vdots & \vdots \
x_m & 1
\end{matrix}
\right]
$
现在就是要求
E
(
w
⃗
)
E(\vec{w})
E(w)的最小值,将
E
(
w
⃗
)
E(\vec{w})
E(w)对
w
⃗
\vec{w}
w求导得KaTeX parse error: Expected 'EOF', got '\matrix' at position 51: …l \vec{w}} = -2\̲m̲a̲t̲r̲i̲x̲{X}^T(\vec{y} -…
求导过程如下:
令
(6)
∂
E
(
w
⃗
)
∂
w
⃗
=
0
\frac{\partial E(\vec{w})}{\partial \vec{w}} = 0 \tag{6}
∂w∂E(w)=0(6)解得KaTeX parse error: Expected 'EOF', got '\matrix' at position 15: \vec{w}^@ = (\̲m̲a̲t̲r̲i̲x̲{X}^T\matrix{X}…
(注意:
w
⃗
\vec{w}
w上方的^markdown语法不会,这里用@符号代替)
式(6)中的
w
⃗
\vec{w}
w是一个向量,因此式(6)实际上是一个方程组,若式(6)有解(即要求KaTeX parse error: Expected 'EOF', got '\matrix' at position 1: \̲m̲a̲t̲r̲i̲x̲{X}^T\matrix{X}可逆),则我们称这个方程组为正规方程(Normal Equation) [3][4]。
w
⃗
\vec{w}
w上方的小标记表示,这是当前可以估计出的最优解。从现有数据上估计出的
w
⃗
\vec{w}
w可能并不是数据中的真实
w
⃗
\vec{w}
w值,所以这里使用了一个“帽”符号来表示它仅仅是
w
⃗
\vec{w}
w的一个最优估计。
上述公式中需要对矩阵求逆,因此这个式子只在逆矩阵存在的时候适用。然而并不是所有矩阵的逆都存在,当矩阵逆不存在的时候该怎么办呢?这一点在后面将会讲到。
##代码示例##
regression.py[2]
'''
Created on Jan 8, 2011
@author: Peter
'''
from numpy import *
def loadDataSet(fileName): #general function to parse tab -delimited floats
numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
def standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T*yMat)
return ws
import regression
from numpy import *
xArr, yArr = regression.loadDataSet('ex0.txt')
# 用线性回归求得最佳拟合直线的参数
ws = regression.standRegres(xArr, yArr)
xMat = mat(xArr)
yMat = mat(yArr)
# 使用新的ws来计算yHat
yHat = xMat * ws
import matplotlib.pyplot as plt
fig = plt.figure()
#画出数据集散点图
ax = fig.add_subplot(111)
ax.scatter(xMat[:, 1].flatten().A[0], yMat.T[:, 0].flatten().A[0])
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xCopy*ws
# 画出最佳拟合直线
ax.plot(xCopy[:, 1].A, yHat.A)
plt.show()
##如何判断模型的好坏##
几乎任一数据集都可以用上述方法建模,那么,如何判断这些模型的好坏呢?[2]比较一下下图中的两个子图,如果在两个数据集上分别作线性回归,将得到完全一样的模型(拟合直线)。显然两个数据是不一样的,那么模型分别在二者上的效果如何?我们当如何比较这些效果的好坏呢?有种方法可以计算预测值yHat序列和真实值y序列的匹配程度,那就是计算这两个序列的相关系数。
##用正规方程求解时矩阵
X
T
X
X^TX
XTX不可逆时的解决办法##
关于不可逆矩阵,我们也称之为奇异或退化矩阵。矩阵不可逆的情况通常有以下几种[3-4.7]:
- 特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸这两个特征,例如在预测住房价格时,如果 x 1 x_1 x1是以英尺为尺寸规格计算的房子, x 2 x_2 x2是以平方米为尺寸规格计算的房子,同时,你也知道1米等于3.28英尺,这样,你的这两个特征值将始终满足约束: x 1 = x 2 ∗ ( 3.28 ) 2 x_1 = x_2 * (3.28)^2 x1=x2∗(3.28)2;
- 特征数量大于训练集的数量。例如,有m=10个训练样本,n=100个特征,这时候参数θ是一个101维的向量(其中一个是常数项)。尝试从10个训练样本中学得101个参数的值是比较困难的。
对于那些不可逆的矩阵,正规方程方法是不能用的。
那么当矩阵不可逆时该怎么办呢?首先,看特征值里是否有一些多余的特征,如果有多余的就删掉,直到他们不再是多余的为止。其次,我们还可以使用一种叫做正则化的线性代数方法。如此即使你有一个相对较小的训练集,也可使用很多的特征来找到很多合适的参数。
另外也可以采用梯度下降法来求解矩阵不可逆时的最优解(me: 用正规方程得到的是真实解,用梯度下降得到的最优解)。梯度下降与正规方程的比较如下表所示:[3-4.6]
梯度下降 | 正规方程 |
---|---|
需要选择学习率α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n大时也能较好适用 | 需要计算
X
T
X
X^TX
XTX, 如果特征数量n较大则运算代价大, 因为矩阵求逆的计算时间复杂度为 O ( n 3 ) O(n^3) O(n3), 通常来说当n<10000时还是可以接受的 |
适用各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
##参考文献##
[1] 周志华. 机器学习
[2] Peter. 机器学习实战
[3] 黄海广. MIT 机器学习教程
[4] https://baike.baidu.com/item/正规方程/10001812?fr=aladdin
最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程(或称为法方程)。