python线性回归_机器学习python实战----线性回归

news/2024/7/4 15:18:34 标签: python线性回归

一、纲要

线性回归的正规方程解法

局部加权线性回归

二、内容详述

1、线性回归的正规方程解法

线性回归是对连续型的数据进行预测。这里讨论的是线性回归的例子,对于非线性回归先不做讨论。这部分内容我们用的是正规方程的解法,理论内容在之前已经解释过了,正规方程为θ = (XT·X)-1·XT·y。值得注意的是这里需要对XT·X求逆矩阵,因此这个方程只有在逆矩阵存在的时候才适用,所以需要在代码中进行判断。

from numpy import *

importmatplotlib.pyplot as pltdefloaddataSet(filename):

numfeat= len(open(filename).readline().split('\t'))-1dataMat= [];labelsVec =[]

file=open(filename)for line infile.readlines():

lineArr=[]

curLine= line.strip().split('\t')for i inrange(numfeat):

lineArr.append(float(curLine[i]))

dataMat.append(lineArr)

labelsVec.append(float(curLine[-1]))returndataMat,labelsVecdefstandRegression(xArr,yArr):

xMat= mat(xArr);yMat =mat(yArr)

xTx= xMat.T *xMatif linalg.det(xTx)==0.0:print('this matrix is singular,cannot do inverse\n')returnsigma= xTx.I * (xMat.T *yMat.T)return sigma

loaddataSet()函数是将文本数据分成特征集和标签。standRegression()是利用正规方程求回归系数sigma,当然在使用正规方程前需要判断其是否有逆矩阵。这种解法很简单,但是它的缺点我也在之前的理论部分说过了。下面我们来看拟合的结果,利用PlotLine()函数来画图。注意这个函数的传入参数xMay和yMat需要为矩阵形式

defPlotLine(xMat,yMat,sigma):

ax= plt.subplot(111)

ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0])

xCopy=xMat.copy()

xCopy.sort(0)

yHat= xCopy*sigma

ax.plot(xCopy[:,1],yHat)

plt.show()

1129302-20171104123901857-1201538967.png

我们得到的拟合直线如图所示,这看起来有点欠拟合的状态。如果用另外一个数据集,得到的拟合直线也是这样的,这也是我们不希望的结果

1129302-20171104124705357-1631535475.png

所以,我们后面对该方法进行改进,对回归系数进行局部加权处理。这里的方法叫做局部加权线性回归(LWLR)

2、局部加权线性回归

该算法中,我们给待预测点附近的每个店赋予一定的权重,然后在其上基于最小均方差进行普通的线性回归。其正规方程变为 θ=(XTX)-1XTWy。这里的W为权重。LWLR使用“核”来对附近的点赋予更高的权重,最常用的就是高斯核,其权重为

1129302-20171104125417638-1849592595.png。这样就构建了只含对角元素的权重矩阵,并且点x与x(i)越近,权重越大。

def lwlr(testPoint,xArr,yArr,k = 1.0):

xMat= mat(xArr);yMat =mat(yArr).T

m=shape(xMat)[0]

weights=mat(eye(m))for i inrange(m):

diffMat= testPoint -xMat[i,:]

weights[i,i]= exp(diffMat * diffMat.T/(-2.0*k**2))

xTWx= xMat.T * (weights*xMat)if linalg.det(xTWx)==0.0:print('this matrix is singular,cannot do inverse\n')returnsigma= xTWx.I * (xMat.T * (weights *yMat))return testPoint *sigmadef lwlrTest(testArr,xArr,yArr,k = 1.0):

m=shape(testArr)[0]

yHat=zeros(m)for i inrange(m):

yHat[i]=lwlr(testArr[i],xArr,yArr,k)return yHat

lwlr()函数即为局部加权线性回归法的代码,lwlrTest()函数的作用是使lwlr()函数遍历整个数据集。我们同样需要画出图来看拟合结果

def PlotLine1(testArr,xArr,yArr,k = 1.0):

xMat=mat(xArr)

yMat=mat(yArr)

yHat=lwlrTest(testArr,xArr,yArr,k)

srtInd= xMat[:,1].argsort(0)

xsort=xMat[srtInd][:,0,:]

ax= plt.subplot(111)

ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0],s = 2,c = 'red')

ax.plot(xsort[:,1],yHat[srtInd])

plt.show()

当 k=1.0 k=0.01 k=0.003

1129302-20171104125957529-1180841179.png

1129302-20171104130337607-609833623.png

1129302-20171104130409029-1067604787.png

k=1.0就是前面的欠拟合状态,而k=0.003就是过拟合状态了,所以当k=0.01时才是比较好的回归。

数据集和代码下载地址:http://pan.baidu.com/s/1i5AayXn


http://www.niftyadmin.cn/n/1274812.html

相关文章

Myeclipse下的Tomcat映射问题

Myeclipse下的Tomcat映射问题 这个问题真的很头疼啊。 环境是: Myeclipse2015 tomcat 8(使用Myeclipse默认导入的配置) 问题呢: 在Myeclipse下创建一个web project,如果是不创建默认web.xml,就可以进入index页面。 如果默认创建了…

centos7上php的启动不了,LINUX入门:CentOS 7卡在开机界面进不去登录界面

《LINUX入门:CentOS 7卡在开机界面进不去登录界面》要点:本文介绍了LINUX入门:CentOS 7卡在开机界面进不去登录界面,希望对您有用。如果有疑问,可以联系我们。CentOS7 系统默认的Python版本是2.7.5,在安装Anaconda pyt…

创建表,创建数据库, 删除表 ,删除数据库

创建表,创建数据库, 删除表 ,删除数据库 创建数据库Create database text2 创建数据库text2 2. 删除数据库 Drop database text2 删除数据库text2 创建表Create table class 创建一个表叫class 这是个主表 ( Code…

python3怎么安装mysql_Python3中mysql的安装

1、准备:请参考大神文章 链接:https://www.cnblogs.com/zhangkanghui/p/9613844.html 2、安装mysql-connectorpip install mysql-connector 安装成功如下:3、下载mysqlclient 去此网站下载对应版本的mysqlclient,博主为Python3.7版…

java蒙特卡罗求主元素,【算法题】6.求主元素

题目已知⼀个整数序列A (a0,a1,a2,...an-1),其中(0< ai <n),(0< i<n). 若存在ap1 ap2 ...apm x,且m>n/2(0<pk题目大意&#xff1a;主元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。输入&#xff1a;[1,2,5,9,5,9,5,5,5]输出&#xff1a;5解析&#xff…

管道-过滤器软件架构

每个构件都有一组输出和输出&#xff0c;构件读输入的数据流&#xff0c;经过内部处理&#xff0c;然后产生输出数据流。因此&#xff0c;这里的构件称为过滤器&#xff0c;这种风格的连接件就像是数据流传输的管道&#xff0c;将一个过滤顺的输出传到另一个过滤器的输入。 一…

c++ string 字符_Linux shell常用字符串操作总结(详细)

Shell 处理程序的时候&#xff0c;经常会涉及到很多与字符串相关的操作。如 sed、awk 都可以针对字符串进行各种操作。在 shell 中也内置了一系列的操作符号。1)字符串操作(长度、读取、替换)例&#xff1a;#获取字符串长度[rootlocalhost ~]# varI love china[rootlocalhost ~…

php阻止垃圾评论,wordpress阻止垃圾评论终极大招

垃圾评论太多&#xff0c;插件也不起作用。有效方法是修改wp-comments-post.php和模板的functions.php添加如下代码&#xff0c;基本上是只允许手工在本站页面提交评论才可以成功。思路是&#xff1a;请求方式不是post的&#xff0c;一律抛弃&#xff1b;域名来源不是本站的&am…