diff --git a/docs/8.预测数值型数据:回归.md b/docs/8.预测数值型数据:回归.md index 2465da4e..5c29ab47 100644 --- a/docs/8.预测数值型数据:回归.md +++ b/docs/8.预测数值型数据:回归.md @@ -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 值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。 + +平方误差可以写做: + +![平方误差](../images/8.Regression/LinearR_18.png) + +用矩阵表示还可以写做 ![平方误差_2](../images/8.Regression/LinearR_19.png) 。如果对 w 求导,得到 ![平方误差_3](../images/8.Regression/LinearR_20.png) ,令其等于零,解出 w 如下(具体求导过程为: http://blog.csdn.net/nomadlx53/article/details/50849941 ): + +![回归系数的最佳估计计算公式](../images/8.Regression/LinearR_1.png) + #### 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)。在这个算法中,我们给预测点附近的每个点赋予一定的权重,然后与 线性回归 类似,在这个子集上基于最小均方误差来进行普通的回归。我们需要最小化的目标函数大致为: + +![局部加权线性回归回归系数公式](../images/8.Regression/LinearR_21.png) + +与 kNN 一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数 w 的形式如下: ![局部加权线性回归回归系数公式](../images/8.Regression/LinearR_4.png) @@ -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)`。 +![岭回归](../images/8.Regression/LinearR_22.png) + 缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。 -这里通过预测误差最小化得到 λ: 数据获取之后,首先抽一部分数据用于测试,生育的作为训练集用于训练参数 w。训练完毕后在测试集上测试预测性能。通过选取不同的 λ 来重复上述测试过程,最终得到一个使预测误差最小的 λ 。 +这里通过预测误差最小化得到 λ: 数据获取之后,首先抽一部分数据用于测试,剩余的作为训练集用于训练参数 w。训练完毕后在测试集上测试预测性能。通过选取不同的 λ 来重复上述测试过程,最终得到一个使预测误差最小的 λ 。 ##### 4.1.1、岭回归 原始代码 diff --git a/docs/9.树回归.md b/docs/9.树回归.md index bd62c137..a79747c4 100644 --- a/docs/9.树回归.md +++ b/docs/9.树回归.md @@ -3,6 +3,23 @@ ![预测数值型数据回归首页](/images/9.TreeRegression/TreeRegression_headPage_xy.png "树回归首页") +## 树回归 概述 + +`我们本章介绍 CART(Classification And Regression Trees, 分类回归树) 的树构建算法。该算法既可以用于分类还可以用于回归。` + +## 树回归 场景 + + + + + + + + + + + + ## CART 算法 > CART 算法简介 diff --git a/images/8.Regression/LinearR_18.png b/images/8.Regression/LinearR_18.png new file mode 100644 index 00000000..753fb011 Binary files /dev/null and b/images/8.Regression/LinearR_18.png differ diff --git a/images/8.Regression/LinearR_19.png b/images/8.Regression/LinearR_19.png new file mode 100644 index 00000000..242884ce Binary files /dev/null and b/images/8.Regression/LinearR_19.png differ diff --git a/images/8.Regression/LinearR_20.png b/images/8.Regression/LinearR_20.png new file mode 100644 index 00000000..bd0ab779 Binary files /dev/null and b/images/8.Regression/LinearR_20.png differ diff --git a/images/8.Regression/LinearR_21.png b/images/8.Regression/LinearR_21.png new file mode 100644 index 00000000..da468432 Binary files /dev/null and b/images/8.Regression/LinearR_21.png differ diff --git a/images/8.Regression/LinearR_22.png b/images/8.Regression/LinearR_22.png new file mode 100644 index 00000000..2bfe65cf Binary files /dev/null and b/images/8.Regression/LinearR_22.png differ diff --git a/src/python/8.PredictiveNumericalDataRegression/regression.py b/src/python/8.PredictiveNumericalDataRegression/regression.py index 1e445cf3..5372cdee 100644 --- a/src/python/8.PredictiveNumericalDataRegression/regression.py +++ b/src/python/8.PredictiveNumericalDataRegression/regression.py @@ -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() \ No newline at end of file + regression4() + # regression5() \ No newline at end of file