回归

简介:

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

平方误差确定回归系数

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

_ i = 1 m ( y _ i x _ i T w ) 2 )

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

w = ( X T X ) 1 X T y

算法实现如下:

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 = ( X T W X ) 1 X T W y

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

w ( i , j ) = e x p ( | x ( i ) x | 2 k 2 )

其中,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


相关文章
|
2月前
|
机器学习/深度学习 数据采集
SVM在回归任务中如何应用
SVM在回归任务中如何应用
WK
|
4月前
|
机器学习/深度学习 算法 数据挖掘
什么是逻辑回归分类器
逻辑回归分类器是一种广泛应用于二分类问题的统计方法,它基于线性组合并通过Sigmoid函数将输出映射为概率值进行分类。核心原理包括:线性组合假设函数、Sigmoid函数转换及基于概率阈值的预测。该模型计算高效、解释性强且鲁棒性好,适用于信用评估、医疗诊断、舆情分析和电商推荐等多种场景。利用现有机器学习库如scikit-learn可简化其实现过程。
WK
55 1
|
机器学习/深度学习 传感器 算法
【SVM回归预测】基于支持向量机的数据回归预测(libsvm)附matlab代码
【SVM回归预测】基于支持向量机的数据回归预测(libsvm)附matlab代码
|
8月前
|
机器学习/深度学习 并行计算 算法
【视频】Lasso回归、岭回归等正则化回归数学原理及R语言实例(一)
【视频】Lasso回归、岭回归等正则化回归数学原理及R语言实例(一)
|
8月前
|
机器学习/深度学习 存储 算法
【视频】Lasso回归、岭回归等正则化回归数学原理及R语言实例(二)
【视频】Lasso回归、岭回归等正则化回归数学原理及R语言实例二)
|
机器学习/深度学习 数据采集 算法
基于随机森林实现特征选择降维及回归预测(Matlab代码实现)
基于随机森林实现特征选择降维及回归预测(Matlab代码实现)
409 0
|
机器学习/深度学习 算法 数据挖掘
机器学习算法: Logistic 回归 详解
机器学习算法: Logistic 回归 详解
19922 1
机器学习算法: Logistic 回归 详解
特征选择:回归,二分类,多分类特征选择有这么多差异需要注意
特征选择:回归,二分类,多分类特征选择有这么多差异需要注意
166 0
|
机器学习/深度学习 算法
连载|GBDT如何进行回归和分类
连载|GBDT如何进行回归和分类
|
数据采集 知识图谱
4-1预测与回归
4-1预测与回归
129 0
4-1预测与回归

相关实验场景

更多