实现标准线性回归

介绍

线性回归是假设特证满足线性关系,根据给定的训练数据训练一个模型,即回归方程,并用此模型进行预测,回归:求回归系数的过程。具体做法是用回归系数乘以输入值,将结果相加,得到预测值。它是一种针对数值型数据的监督学习方法。


特点

  1. 适用于数值型,如果是标称型或名义型的数据,需要转为数值型数据

  2. 对于非线性数据拟合较差


查看数据分布

  1. 数据集包含150个样本,每个样本共2个特征,第1个为输入,第2个为结果。由于没有提供测试集,因此随机选择100个样本作为训练集,50个样本剔除结果后作为测试集;
  2. 通过散点图查看样本分布情况
#!/bin/usr/python
# -*- coding:utf-8 -*-
from numpy import *
from matplotlib import pyplot as plt

def loadDataSet(fileName):
    data = []
    dataSet = []
    xArr = []
    yArr = []
    fr = open(fileName)
    [data.append(line.strip('\r\n').split(',')) for line in fr.readlines()]
    [dataSet.append([float(line[0]), float(line[1])]) for line in data]
    [xArr.append([1,line1[0]]) for line1 in dataSet]
    [yArr.append(line2[-1]) for line2 in dataSet]
    return dataSet,xArr,yArr


def show(dataSet,xarr,yarr,ws):
    for i in range(shape(dataSet)[0]):
        plt.scatter(dataSet[i][0], dataSet[i][1], marker='o', color='r', label='1', s=10)
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.title('Sample Distribute')
    plt.show()

实现标准线性回归_第1张图片
可以看出,第一维特征和第二维特征具有某种线性关系


回归方程

Yi=XTiw

XiwYi

具体做法
1. 找到使误差最小的w, 误差是指预测值和真实值之间的误差
2. 由于误差可正可负,因此采用平方误差

i=1m(yixTiw)2

3. 对w求导,令它等于0,得到w的最优值:
w=XTX)1XTy

def regression(xArr,yArr):
    xMat = mat(xArr)
    yMat = mat(yArr).T
    xTx = xMat.T*xMat
    if linalg.det(xTx) == 0.0:
        print "矩阵不可逆!!"
        return
    w = xTx.I * (xMat.T*yMat)
    return w

实现标准线性回归_第2张图片

绘制拟合模型和样本分布

def show(dataSet,xarr,yarr,ws):
        xMat = mat(xarr)
    yMat = mat(yarr)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0],marker='o', color='r', label='1', s=10)
    xCopy = xMat.copy()
    xCopy.sort(0)
    yHat = xMat * ws
    ax.plot(xCopy[:,1],yHat)
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.title('Regression')
    plt.show()

实现标准线性回归_第3张图片


验证模型优劣

方法:计算测试集的被剔除的真实Y序列和预测Y序列的相关系数

def main():
    dataSet,xarr,yarr = loadDataSet(r'/home/hu/文档/ML/iris.txt')  #load trainSet
    testSet,xTarr,yTarr = loadDataSet(r'/home/hu/文档/ML/irisTest.txt')  # load testSet
    #w = regression(xarr,yarr)
    w = regression(xTarr,yTarr)
    YPre = mat(xTarr)*w
    print corrcoef(YPre.T,yTarr)
    show(dataSet,xarr,yarr,w)


if __name__ == '__main__':
    main()

这里写图片描述
由上图可知,YPre预测值和YTarr实际值的相关系数达到0.95,采用此方法具有建模效果不错。

你可能感兴趣的:(机器学习)