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

一 线性回归(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,:].flatten().A[0])
print(xMat[:,1].flatten().A[0])
xCopy=xMat.copy()
xCopy.sort(0)
predictY=xCopy*ws
ax.plot(xCopy[:,1],predictY)

plt.show()

分析结果我们可以看出线性回归得到的相关性还是挺理想的,但是从图像中明显可以看出线性回归未能捕获到一些数据点,没能很好的表示数据的变化趋势,在某种情况下存在欠拟合的情况,这是线性回归的一个缺点。在此想要说明的一点是,要只是简单的实现拟合的话,不妨采用MATLAB中的cftool的工具,简单高效直观。

二 局部加权线性回归

(Locally Weighted Linear Regression,LWLR)

1.概述

  针对于线性回归存在的欠拟合现象,可以引入一些偏差得到局部加权线性回归对算法进行优化。在该算法中,给待测点附近的每个点赋予一定的权重,进而在所建立的子集上进行给予最小均方差来进行普通的回归,分析可得回归系数w可表示为:

w = (xTWx)-1xTWy,其中W为每个数据点赋予的权重,那么怎样求权重呢,核函数可以看成是求解点与点之间的相似度,在此可以采用核函数,相应的根据预测点与附近点之间的相似程度赋予一定的权重,在此选用最常用的高斯核,则权重可以表示为:w(i,i) = exp(|x(i) - x| / -2k2),其中K为宽度参数,至于此参数的取值,目前仍没有一个确切的标准,只有一个范围的描述,所以在算法的应用中,可以采用不同的取值分别调试,进而选取最好的结果。

2.python实现

结合上述的分析,采用python编程实现,代码如下:

def juxxjq(test,xArr,yArr,k=1.0):
    '''
    本函数给定x空间的任意一个点,计算出对应的预测值yHat
    过程:
    1.读入数据,创建矩阵
    2.创建对角权重矩阵weights ,他是一个方阵,阶数等于样本点个数,即该矩阵为每个样本初始化一个权重
    3.算法将遍历数据集,计算每个样本对应的权重值,随着样本点与待测点距离的递增,权重将以指数级减少
    可以通过k控制速度
    4.在权重矩阵计算完后,就可以对回归系数的一个估计
    '''
    xMat = mat(xArr)
    yMa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WJWFighting

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

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

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

打赏作者

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

抵扣说明:

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

余额充值