回归:预测数值型数据

何为回归?

“回归”一词是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。

Galton在大量对象上应用了回归分析,甚至包括人的身高预测。他注意到,如果双亲的高高度比平均高度高,他们的子女也倾向于比平均高度高,但尚不及双亲(笔者感觉未必,Galton并未考虑物质条件的发展会带来整体身高的增加,至少笔者感觉80,90的人普遍比父母高)。孩子的高度向着平均高度“回归”。

在软件测试方法论中有回归测试一说,大概是指保证原feature正确,没有收到改动的影响。

用线性回归找到最佳拟合直线

回归的目的是预测数值型的目标值。最直接的办法就是求得一个回归方程(regression equation),讲已知条件x代入方程得到预测结果y。

说道回归,一般都是指线性回归,线性回归意味着可以将输入项分别乘以一些常量,再将结果加起来得到输出。

如何求回归方程的主要步骤是求回归系数,一旦有了回归系数,就可以构造出回归方程。

假定输入数据存放在矩阵X中,而回归系数存放在向量w中,那么对于给定的数据X1,预测结果将会通过Y1=XT1w给出。

那么,如果通过已知的x和y关系集合,找到w呢?一个常用的方法就是找出使误差最小的w。这里的误差指的是预测y值和真实y值之间的差值。可以通过使用该误差的累加得出x,y关系集合的最佳w。可是由于累加将使正差值和负差值相互抵消,所以在计算的时候采用平方误差:

用矩阵表示还可以写作(y-Xw)(y-Xw)。如果对w求导,得到XT(Y-Xw),令其等于0,解出w:

w上的小标记表示,这是当前可以估计出的w的最优解。

注意,上述公式中包含(XTX-1,也就是需要对矩阵求逆。因此这个方程只在逆矩阵存在的情况下适用。

除了矩阵方法外,还有很多其他的方法可以求解w,比如“普通最小二乘法”。

求w的代码:

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 

局部加权线性回归

线性回归的一个问题是有可能出现欠拟合现象,因为它要求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。

其中的一个方法是局部加权线性回归(Locally Weighted Linear Regression, LWLR)。在该算法中个,我们给待预测点的附近的每个点赋予一定的权重,在这个子集上基于最小均方差来进行普通的回归。与KNN一样,这种算法每次预测均需要事先取出对应的数据子集。该算法解除回归系数w的形式如下:

其中w是一个矩阵,用来给每个数据点赋予权重。

LWLR使用“核”来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

上述公式中包含了一个需要用户指定的参数K,它决定了对附近的点赋予多大的权重。

LWLR的实现代码:

def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye((m)))
    for j in range(m):                      #next 2 lines create weights matrix
        diffMat = testPoint - xMat[j,:]     #
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws

def lwlrTest(testArr,xArr,yArr,k=1.0):  #loops over all the data points and applies lwlr to each one
    m = shape(testArr)[0]
    yHat = zeros(m)
    for i in range(m):
        yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    return yHat
时间: 2024-10-09 06:48:19

回归:预测数值型数据的相关文章

机器学习——预测数值型数据:回归

线性回归 优点:结果易于理解,计算上不复杂 缺点:对非线性的数据拟合不好 适用数据类型:数值型和标称型数据 回归的目的就预测数值型的目标值.最直接的办法就是依据输入写一个目标值的计算公式.这个计算公式就是所谓的回归方程(regression equation),其中的参数就是回归系数,求这些回归系数的过程就是回归. 说道回归,一般都是指线性回归(linear regression). 一元线性回归的矩阵形式可以写成,其中 是噪声,b是回归系数(斜率) 或者 ,其中y.X.a.都是n维向量,而b是

机器学习实战第8章预测数值型数据:回归

1.简单的线性回归 假定输入数据存放在矩阵X中,而回归系数存放在向量W中,则对于给定的数据X1,预测结果将会是 这里的向量都默认为列向量 现在的问题是手里有一些x和对应的y数据,怎样才能找到W呢?一个常用的方法是找到使误差最小的W,这里的误差是指预测y值与真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差. 平方误差可以写做: 用矩阵表示可以写成 使用上式对w进行求导: 具体可参考https://blog.csdn.net/nomadlx53/articl

机器学习实战第8章预测数值型数据:回归2

1. Shrinkage(缩减) Methods 当特征比样本点还多时(n>m),输入的数据矩阵X不是满秩矩阵,在求解(XTX)-1时会出现错误.接下来主要介绍岭回归(ridge regression)和前向逐步回归(Foward Stagewise Regression)两种方法. 1.1 岭回归(ridge regression) 简单来说,岭回归就是在矩阵XTX上加上一个从而使得矩阵非奇异,进而能进行求逆.其中矩阵I是一个单位矩阵,是一个调节参数. 岭回归的回归系数计算公式为: 岭回归最先

第八章:预测数值型数据:回归

本章内容□ 线性回归□ 局部加权线性回归□ 岭回归和逐步线性回归□ 预测鲍鱼年龄和玩具售价  8.1用线性回归找到最佳拟合直线

机器学习--标称型和数值型数据

在监督学习(supervised learning)的过程中,只需要给定输入样本集,机器就可以从中推演出指定目标变量的可能结果.监督学习相对比较简单,机器只需从输入数据中预测合适的模型,并从中计算出目标变量的结果. 监督学习一般使用两种类型的目标变量:标称型和数值型 标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类) 数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)-------------

预测数值型数据-回归(Regression)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

VBA学习---字符串型数值和数值型字符串相互转换

一.数值转化为字符串函数Str.CStr Str函数将数值转换为字符串,即返回一个代表一个数值的字符串,其语法为: Str(number) CStr函数将数值表达式转换为字符串,其语法为: CStr(mynumberExpression)     注意:当一个数值转换成字符串时,总会在其前面保留一个空位来表示正负,即字符串的第一位一定是空格或正负号,Str将英文句号(.)作为有效的小数点.          演示代码: Sub StrTranfomationDemo() Dim myDouble

HotSpot关联规则算法(1)-- 挖掘离散型数据

提到关联规则算法,一般会想到Apriori或者FP,一般很少有想到HotSpot的,这个算法不知道是应用少还是我查资料的手段太low了,在网上只找到很少的内容,这篇http://wiki.pentaho.com/display/DATAMINING/HotSpot+Segmentation-Profiling ,大概分析了一点,其他好像就没怎么看到了.比较好用的算法类软件,如weka,其里面已经包含了这个算法,在Associate--> HotSpot里面即可看到,运行算法界面一般如下: 其中,

数据预处理 | 使用 sklearn.preprocessing.OrdinalEncoder 将分类特征转换为数值型

from sklearn.preprocessing import OrdinalEncoder model_oe = OrdinalEncoder() string_data_array = model_oe.fit_transform(string_data) string_data_pd = pd.DataFrame(string_data_con,columns=string_data.columns) 说明: 1  string_data  是挑出来的 需要转成数值型特征的 分类特征