回归分析---线性回归原理和Python实现学习笔记

为何要学习回归?机器学习实战做者说‘回归能够任何事情’。python

1 线性回归原理

假设有以下方程,就是一个回归方程,系数wi为回归系数,求回归系数的过程被称为回归算法

线性回归意味着能够将输入项分别乘以一些常量,再将结果加起来获得输出,那么怎样求回归系数呢?app

至此线性回归推到已完成,接下来介绍线性回归的实现步骤机器学习

2 线性回归Python实现

——————————————————————————————————————————————————学习

from numpy import *
import matplotlib.pyplot as plt

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    dataMat = []
    labelMat=[]
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        dataMat.append([float(curLine[0]),float(curLine[1])])
        labelMat.append(float(curLine[2]))
    print shape(dataMat)
    print shape(labelMat)
    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"#行列式的值为0,无逆矩阵
        return  '行列式为0'
    ws = xTx.I * (xMat.T*yMat)
#    ws=linalg.solve(xTx, xMat.T*yMat)
    print ws
    return ws 
#
def show(dataMat,labelMat,ws):
    xMat = mat(dataMat)
    yMat = mat(labelMat)
    yHat=xMat*ws
    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(xMat[:,1],yMat.T[:,0])
#    ax.scatter(xMat[:,0].flatten().A[0],yMat.T[:,0].flatten().A[0])
    ax.plot(xMat[:,1],yHat)
#    xcopy=xMat.copy()
#    xcopy.sort(0)
#    yHat=xcopy*ws
#    ax.plot(xcopy[:,1],yHat)
    plt.show()
    corr=corrcoef(yHat.T,yMat)
    print corr
    return corr

结果以下图所示,
spa

为改进线性回归算法的准确率,有很过改进的算法,其中有局部加权线性回归,以下是各展现3d

分别在K=1,K=0.1,K=0.01,K=0.003,当K=1为普通的线性回归,当K=0.1变化不明显,当K=0.01是拟合效果较好,当K=0.03时出现过拟合现象code

 

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

此外,若是数据的特征比样本点还多应该怎么办?统计学家引入岭回归、Lasso、前向逐步回归来解决这个问题,有兴趣的同窗能够自行研究blog