回归

简介:

更好的阅读,请访问littlefish.top
回归的目的是预测数值型目标值。类似于y=w_1x_1+w_2x_2y=w_1⋅x_1+w_2⋅x_2,其中w称为回归系数,只要可以确定w,就可以通过输入x得到预测值。

平方误差确定回归系数

假设输入为x,输出为y,则平方误差可以表示为:

_i=1m(y_ix_iTw)2)∑_i=1m(y_i−x_iTw)2)

为了让平方误差最小,令导数为0求得最佳回归系数,则

w=(XTX)1XTyw=(XTX)−1XTy

算法实现如下:

from numpy import *
import matplotlib.pyplot as plt

def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split('\t')) - 1 
    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
    
def regression1():
    xArr, yArr = loadDataSet("Ch08/ex0.txt")
    xMat = mat(xArr)
    yMat = mat(yArr)
    ws = standRegres(xArr, yArr)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    print xMat[:, 1].flatten()
    print yMat.T[:, 0].flatten()
    ax.scatter(xMat[:, 1].flatten(), yMat.T[:, 0].flatten().A[0])
    xCopy = xMat.copy() 
    xCopy.sort(0)
    yHat = xCopy * ws
    ax.plot(xCopy[:, 1], yHat)
    plt.show()

if __name__ == "__main__":
    regression1()

结果如下:

线性拟合

局部加权线性回归

最简单的线性回归(locally weighted linear regression)具有最小均方误差的无偏估计,因此会出现欠拟合现象。通过局部加权线性回归就可以优化预测结果,局部加权的回归系数w如下:

w=(XTWX)1XTWyw=(XTWX)−1XTWy

其中,W是类似于“核”来对调整不同权值的权重。最常用的核是高斯核,如下:

w(i,j)=exp(|x(i)x|2k2)w(i,j)=exp(|x(i)−x|−2k2)

其中,k会对权重产生影响,k越小,权重变化越快。

算法实现

通过核函数来调整权值的权重,可以让附近的点的赋予更高的权值。

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

def regression2():
    xArr, yArr = loadDataSet("Ch08/ex0.txt")
    yhat = lwlrTest(xArr, xArr, yArr, 0.01)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    xMat = mat(xArr)
    srtInd = xMat[:, 1].argsort(0)
    xSort = xMat[srtInd][:, 0, :]
    ax.plot(xSort[:, 1], yhat[srtInd])
    ax.scatter(xMat[:, -1].flatten(), mat(yArr).T.flatten().A[0], s=2, c="red")
    plt.show()

结果如下:

局部加权k=0.01

局部加权k=0.003

因此,k值如果越小会考虑太多的噪声影响,选择适合的k值可以得到最优的结果。

知识共享许可协议
本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012


相关文章
|
9月前
|
机器学习/深度学习 存储 索引
用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归
用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归
99 0
|
9月前
特征选择:回归,二分类,多分类特征选择有这么多差异需要注意
特征选择:回归,二分类,多分类特征选择有这么多差异需要注意
96 0
|
9月前
|
机器学习/深度学习 数据可视化 算法
机器学习系列6 使用Scikit-learn构建回归模型:简单线性回归、多项式回归与多元线性回归
在本文中,我们以美国南瓜数据为例,讲解了三种线性回归的原理与使用方法,探寻数据之间的相关性,并构建了6种线性回归模型。将准确率从一开始的0.04提升到0.96.
212 0
|
11月前
|
机器学习/深度学习 算法
连载|GBDT如何进行回归和分类
连载|GBDT如何进行回归和分类
|
数据采集 知识图谱
4-1预测与回归
4-1预测与回归
4-1预测与回归
|
机器学习/深度学习 算法 开发者
回归模型参数估计-5| 学习笔记
快速学习回归模型参数估计-5。
152 0
回归模型参数估计-5| 学习笔记
|
机器学习/深度学习 算法 开发者
回归模型参数估计-4| 学习笔记
快速学习回归模型参数估计-4。
119 0
回归模型参数估计-4| 学习笔记
|
机器学习/深度学习 算法 开发者
回归模型参数估计-3| 学习笔记
快速学习回归模型参数估计-3。
95 0
回归模型参数估计-3| 学习笔记
|
机器学习/深度学习 算法 开发者
回归模型的参数估计-1| 学习笔记
快速学习回归模型的参数估计-1。
183 0
回归模型的参数估计-1| 学习笔记
|
机器学习/深度学习 算法 开发者
回归模型的参数估计-2| 学习笔记
快速学习回归模型的参数估计-2。
120 0
回归模型的参数估计-2| 学习笔记