机器学习——线性回归的自定义实现

一 线性回归(Linear Regression)  

1. 线性回归概述

  回归的目的是预测数值型数据的目标值,最直接的方法就是根据输入写出一个求出目标值的计算公式,也就是所谓的回归方程,例如y = ax1+bx2,其中求回归系数的过程就是回归。那么回归是如何预测的呢?当有了这些回归系数,给定输入,具体的做法就是将回归系数与输入相乘,再将结果加起来就是最终的预测值。说到回归,一般指的都是线性回归,当然也存在非线性回归,在此不做讨论。

  假定输入数据存在矩阵x中,而回归系数存放在向量w中。那么对于给定的数据x1,预测结果可以通过y1 = x1Tw给出,那么问题就是来寻找回归系数。一个最常用的方法就是寻找误差最小的w,误差可以用预测的y值和真实的y值的差值表示,由于正负差值的差异,可以选用平方误差,也就是对预测的y值和真实的y值的平方求和,用矩阵可表示为:(y - xw)T(y - xw),现在问题就转换为寻找使得上述矩阵值最小的w,对w求导为:xT(y - xw),令其为0,解得:w = (xTx)-1xTy,这就是采用此方法估计出来的

注:数据集ex0.txt在此博客的最后面

2.python实现

from numpy import *
%matplotlib inline
import matplotlib.pyplot as plt

def loadDataSet(fileName):
    dataSet=[]
    labels=[]
    fr=open(fileName)
    for line in fr.readlines():
        lineArr=[]
        curLine=line.strip().split('\t')
        for i in range(len(curLine)-1):
            lineArr.append(float(curLine[i]))
        dataSet.append(lineArr)
        labels.append(float(curLine[-1]))
    return dataSet,labels

dataSet,labels=loadDataSet('dataset/ex0.txt')
def standardRegression(dataSet,labels):
    '''
    标准的回归函数的目标是:回归系数ws
    '''
    #1.x^t*x的结果
    xMat=mat(dataSet)
    yMat=mat(labels)
    #print(yMat.T)
    xTx=xMat.T*xMat
    #2.求上面的结果矩阵是否可逆
    if linalg.det(xTx)==0.0:
        print('此矩阵为不可逆矩阵')
        return
    ws=xTx.I*(xMat.T*yMat.T)
    return ws

ws=standardRegression(dataSet,labels)

#求预测值
xMat=mat(dataSet)
yMat=mat(labels).T
predict=xMat*ws
print(predict[0:5])
print(yMat[0:5])
#请加入模型的评测函数
#1.平均绝对误差  Mean Absolute Error,MAE  |y-mean(y)|求和/n
meanValue=mean(yMat)
print('均值:',meanValue)
print('长度:',len(yMat))
#print('差:',yMat-meanValue)
MAE=sum(abs(yMat-mean(yMat)))/len(yMat)
print(MAE)

#2.均方误差 Mean Squared Error ,MSE (y-predict)^2,求和/n
diff=yMat-predict
#print("diff:",diff)
squarel=square(diff)
MSE=sum(squarel)/len(yMat)
print(MSE)

#3.R-squred 1-((y-predict)^2求和)|y-mean(y)|求和
#1-(MSE/MAE)
r=1.0-(sum(square(yMat-predict))/sum(square(yMat-mean(yMat))))
print(r)
#绘制图表来显示  数据点与模型的关系
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))
ax=fig.add_subplot(111)
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WJWFighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值