mirror of
https://github.com/apachecn/ailearning.git
synced 2026-05-07 22:24:18 +08:00
@@ -23,6 +23,16 @@ HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio
|
||||
|
||||
### 1、线性回归
|
||||
|
||||
我们应该怎样从一大堆数据里求出回归方程呢? 假定输入数据存放在矩阵 x 中,而回归系数存放在向量 w 中。那么对于给定的数据 X1,预测结果将会通过 Y = X1^T w 给出。现在的问题是,手里有一些 X 和对应的 y,怎样才能找到 w 呢?一个常用的方法就是找出使误差最小的 w 。这里的误差是指预测 y 值和真实 y 值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。
|
||||
|
||||
平方误差可以写做:
|
||||
|
||||

|
||||
|
||||
用矩阵表示还可以写做  。如果对 w 求导,得到  ,令其等于零,解出 w 如下(具体求导过程为: http://blog.csdn.net/nomadlx53/article/details/50849941 ):
|
||||
|
||||

|
||||
|
||||
#### 1.1、线性回归 须知概念
|
||||
|
||||
##### 1.1.1、矩阵求逆
|
||||
@@ -43,7 +53,7 @@ HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio
|
||||
#### 1.2、线性回归 工作原理
|
||||
|
||||
```
|
||||
读入数据,将数据特征想、特征标签y存储在矩阵x、y中
|
||||
读入数据,将数据特征x、特征标签y存储在矩阵x、y中
|
||||
验证 x^Tx 矩阵是否可逆
|
||||
使用最小二乘法求得 回归系数 w 的最佳估计
|
||||
```
|
||||
@@ -168,7 +178,11 @@ def regression1():
|
||||
|
||||
线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
|
||||
|
||||
一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在这个算法中,我们给预测点附近的每个点赋予一定的权重,然后与 线性回归 类似,在这个子集上基于最小均方误差来进行普通的回归。与 kNN 一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数 w 的形式如下:
|
||||
一个方法是局部加权线性回归(Locally Weighted Linear Regression,LWLR)。在这个算法中,我们给预测点附近的每个点赋予一定的权重,然后与 线性回归 类似,在这个子集上基于最小均方误差来进行普通的回归。我们需要最小化的目标函数大致为:
|
||||
|
||||

|
||||
|
||||
与 kNN 一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数 w 的形式如下:
|
||||
|
||||

|
||||
|
||||
@@ -187,7 +201,7 @@ LWLR 使用 “核”(与支持向量机中的核类似)来对附近的点
|
||||
#### 2.1、局部加权线性回归 工作原理
|
||||
|
||||
```
|
||||
读入数据,将数据特征想、特征标签y存储在矩阵x、y中
|
||||
读入数据,将数据特征x、特征标签y存储在矩阵x、y中
|
||||
利用高斯核构造一个权重矩阵 W,对预测点附近的点施加权重
|
||||
验证 X^TWX 矩阵是否可逆
|
||||
使用最小二乘法求得 回归系数 w 的最佳估计
|
||||
@@ -390,15 +404,15 @@ def abaloneTest():
|
||||
|
||||
# 打印出 不同的核预测值 与 新数据集(测试数据集)上的真实值之间的误差大小
|
||||
newyHat01 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 0.1)
|
||||
print "new yHat01 error Size is :" , rssError(abY[0:99], yHat01.T)
|
||||
print "new yHat01 error Size is :" , rssError(abY[0:99], newyHat01.T)
|
||||
newyHat1 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 1)
|
||||
print "new yHat1 error Size is :" , rssError(abY[0:99], yHat1.T)
|
||||
print "new yHat1 error Size is :" , rssError(abY[0:99], newyHat1.T)
|
||||
newyHat10 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 10)
|
||||
print "new yHat10 error Size is :" , rssError(abY[0:99], yHat10.T)
|
||||
print "new yHat10 error Size is :" , rssError(abY[0:99], newyHat10.T)
|
||||
|
||||
# 使用简单的 线性回归 进行预测,与上面的计算进行比较
|
||||
standWs = standRegres(abX[0:99], abY[0:99])
|
||||
standyHat = mat(abx[100:199]) * standWs
|
||||
standyHat = mat(abX[100:199]) * standWs
|
||||
print "standRegress error Size is:", rssError(abY[100:199], standyHat.T.A)
|
||||
```
|
||||
|
||||
@@ -426,9 +440,11 @@ def abaloneTest():
|
||||
|
||||
岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入 λ 来限制了所有 w 之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫作 `缩减(shrinkage)`。
|
||||
|
||||

|
||||
|
||||
缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。
|
||||
|
||||
这里通过预测误差最小化得到 λ: 数据获取之后,首先抽一部分数据用于测试,生育的作为训练集用于训练参数 w。训练完毕后在测试集上测试预测性能。通过选取不同的 λ 来重复上述测试过程,最终得到一个使预测误差最小的 λ 。
|
||||
这里通过预测误差最小化得到 λ: 数据获取之后,首先抽一部分数据用于测试,剩余的作为训练集用于训练参数 w。训练完毕后在测试集上测试预测性能。通过选取不同的 λ 来重复上述测试过程,最终得到一个使预测误差最小的 λ 。
|
||||
|
||||
##### 4.1.1、岭回归 原始代码
|
||||
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
|
||||

|
||||
|
||||
## 树回归 概述
|
||||
|
||||
`我们本章介绍 CART(Classification And Regression Trees, 分类回归树) 的树构建算法。该算法既可以用于分类还可以用于回归。`
|
||||
|
||||
## 树回归 场景
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## CART 算法
|
||||
|
||||
> CART 算法简介
|
||||
|
||||
BIN
images/8.Regression/LinearR_18.png
Normal file
BIN
images/8.Regression/LinearR_18.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
images/8.Regression/LinearR_19.png
Normal file
BIN
images/8.Regression/LinearR_19.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
images/8.Regression/LinearR_20.png
Normal file
BIN
images/8.Regression/LinearR_20.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1001 B |
BIN
images/8.Regression/LinearR_21.png
Normal file
BIN
images/8.Regression/LinearR_21.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
BIN
images/8.Regression/LinearR_22.png
Normal file
BIN
images/8.Regression/LinearR_22.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
@@ -539,15 +539,15 @@ def abaloneTest():
|
||||
|
||||
# 打印出 不同的核预测值 与 新数据集(测试数据集)上的真实值之间的误差大小
|
||||
newyHat01 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 0.1)
|
||||
print "new yHat01 error Size is :" , rssError(abY[0:99], yHat01.T)
|
||||
print "new yHat01 error Size is :" , rssError(abY[0:99], newyHat01.T)
|
||||
newyHat1 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 1)
|
||||
print "new yHat1 error Size is :" , rssError(abY[0:99], yHat1.T)
|
||||
print "new yHat1 error Size is :" , rssError(abY[0:99], newyHat1.T)
|
||||
newyHat10 = lwlrTest(abX[100:199], abX[0:99], abY[0:99], 10)
|
||||
print "new yHat10 error Size is :" , rssError(abY[0:99], yHat10.T)
|
||||
print "new yHat10 error Size is :" , rssError(abY[0:99], newyHat10.T)
|
||||
|
||||
# 使用简单的 线性回归 进行预测,与上面的计算进行比较
|
||||
standWs = standRegres(abX[0:99], abY[0:99])
|
||||
standyHat = mat(abx[100:199]) * standWs
|
||||
standyHat = mat(abX[100:199]) * standWs
|
||||
print "standRegress error Size is:", rssError(abY[100:199], standyHat.T.A)
|
||||
|
||||
|
||||
@@ -581,10 +581,12 @@ def regression5():
|
||||
|
||||
setDataCollect(lgX, lgY)
|
||||
crossValidation(lgX, lgY, 10)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# regression1()
|
||||
# regression2()
|
||||
# abaloneTest()
|
||||
# regression3()
|
||||
# regression4()
|
||||
regression5()
|
||||
regression4()
|
||||
# regression5()
|
||||
Reference in New Issue
Block a user