机器学习算法按照目标变量的类型,分为标称型数据和连续型数据。标称型数据类似于标签型的数据,而对于它的预测方法称为分类,连续型数据类似于预测的结果为一定范围内的连续值,对于它的预测方法称为回归。
含义“回归”一词比较晦涩,下面说一下这个词的来源:
“回归”一词是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。 Galton在大量对象上应用了回归分析,甚至包括人的身高预测。他注意到,如果双亲的高高度比平均高度高,他们的子女也倾向于比平均高度高,但尚不及双亲(笔者感觉未必,Galton并未考虑物质条件的发展会带来整体身高的增加,至少笔者感觉80,90的人普遍比父母高)。孩子的高度向着平均高度“回归”。
类型回归按照方法可分为线性回归和非线性回归。线性回归适用线性方程来拟合曲线进行预测。在非线性回归中,特征之间出现非线性操作的可能性(比如相乘或者相除)。非线性回归中有种特殊的类型--逻辑回归,和线性回归不同的是,它属于“分类”的问题,这是由于它适用曲线拟合的方式来解决分类问题,所以也被称为回归。
线性回归 原理简介线性回归衡量的是两个变量之间的关系,最直接的办法就是求得一个回归方程(regression equation),将已知条件x代入方程得到预测结果y。
假设我们获取到一个地区过去一段时间内的房价走势情况,我们根据下面的公式进行评估:

上面的式子可以看到房价和房屋面积、房子朝向呈线性的关系。而求该方程的过程称为 回归方程 ,其中0.7和0.19称为 回归系数 ,面积和房子的朝向称为 特征 。
可以看到“回归”问题最重要的是如何获得回归方程,如果得到该方程后,所有的一切问题将迎刃而解。
假如我们用 X (m n)来表示特征的矩阵, 回归系数 用 θ (n 1)来表示,预测结果由 Y=Xθ 获得。在实际应用中,我们通常认为能带来最小平方误差的θ就是我们所要寻找的回归系数向量。平方误差指的是预测值与真实值的差的平方,这种方法就称为“ 最小二乘法 ”。所以回归问题转化为如何求最小 平方误差 ,即目标函数为:

求该函数的方法很多,在此介绍一种方法:
对 θ 求导: 该矩阵还可以写成
,如果对 θ 求导,就会得到

倒数为0,求出 θ

注意,上述公式中包含

,也就是需要对矩阵求逆。因此这个方程只在逆矩阵存在的情况下适用。 应用
上面讲解了线性回归的原理,那如何将上面的算法应用到现实的场景中呢?我们使用python语言将上述的算法实现了一遍:
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得到回归系数后,还需要乘以特征值后得到预测值。
大家会说python不是以算法包的种类多而出名吗?有现成的算法库,我干嘛还要自己去实现算法呢。当然,python里面有sklearn包中有现成的linear_model的函数可以供大家使用,而且使用方法特别简单:
导入算法包 from sklearn import datasets, linear_model 训练模型 regr = linear_model.LinearRegression() regr.fit(x, mydata) 预测 predict_outcome = regr.predict(x) 模型评估 基本上所有的数据集都可以使用上述的方法建立模型,那么,如何来判断模型的好坏呢?如果比较一下下面两个图,如果在这两个数据集上做线性回归,那么效果肯定不相同。、
我们可以计算预测值和真实值之间的误差,也就是计算这两个序列的相关系数,来评价模型的好坏。
python中,Numpy库提供了相关系数的计算方法corrcoef(yEstimate,yActual)来计算预测值和真实值之间的相关性。可以看出具有相同回归系数的两组数据,上图的相关系数是0.58,而下图的相关系数是0.99,则可以说明该回归系数对下图使用的数据集效果要好。