线性回归 python小样例

线性回归
优点:结果易于理解,计算上不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型数据
horse=0.0015*annualSalary-0.99*hoursListeningToPulicRadio
这就是所谓的回归方程,其中的0.0015和-0.99称作回归系数,
求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了
具体的做法就是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值
回归的一般方法
(1)收集数据:采用任意方法收集数据
(2)准备数据:回归需要数值型数据,标称型数据将被转成二值型数据(3)分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法球的新回归系数之后,
可以将新拟合线绘在图上作为对比
(4)训练算法:找到回归系数
(5)测试算法:适用R2或者预测值和数据的拟合度,来分析模型的效果
(6)使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,
因为这样可以预测连续型数据而不仅仅是离散的类别标签
应当怎样从一大堆数据中求出回归方程呢?嘉定输入数据存放在举着呢X中,而回归系数存放在向量w中,那么对于
给定的数据x1,预测结果将会通过y1=x1^T *W给出。现在的问题是,手里有些x和对应的y值,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的w。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加
将使得正差值和负差值相互抵消,所以我们采用平方误差

 1 from numpy import *
 2
 3 def loadDataSet(fileName):      #general function to parse tab -delimited floats
 4     numFeat = len(open(fileName).readline().split(‘\t‘)) - 1 #get number of fields
 5     dataMat = []; labelMat = []
 6     fr = open(fileName)
 7     for line in fr.readlines():
 8         lineArr =[]
 9         curLine = line.strip().split(‘\t‘)
10         for i in range(numFeat):
11             lineArr.append(float(curLine[i]))
12         dataMat.append(lineArr)
13         labelMat.append(float(curLine[-1]))
14     return dataMat,labelMat
15
16 def standRegres(xArr,yArr):
17     xMat = mat(xArr); yMat = mat(yArr).T
18     xTx = xMat.T*xMat
19     if linalg.det(xTx) == 0.0:
20         print("This matrix is singular, cannot do inverse")
21         return
22     ws = xTx.I * (xMat.T*yMat)
23     return ws

线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。
显而易见,如果模型欠拟合将不能取得较好的预测结果。所以有些方法允许在估计中引入一些偏差,
从而降低预测的均方误差。
其中一个方法是局部加权线性回归(LWLR)。在该算法中,我们给待预测点附近的每个点赋予一定的权重;

 1 def lwlr(testPoint,xArr,yArr,k=1.0):
 2     xMat = mat(xArr); yMat = mat(yArr).T
 3     m = shape(xMat)[0]
 4     weights = mat(eye((m)))
 5     for j in range(m):                      #next 2 lines create weights matrix
 6         diffMat = testPoint - xMat[j,:]     #
 7         weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))
 8     xTx = xMat.T * (weights * xMat)
 9     if linalg.det(xTx) == 0.0:
10         print("This matrix is singular, cannot do inverse")
11         return
12     ws = xTx.I * (xMat.T * (weights * yMat))
13     return testPoint * ws

如果数据的特征比样本点还多应该怎么办?是否可以使用线性回归和之前的方法来做预测?
答案是否定的,即不能再使用前面介绍的方法,这是因为在计算(x^T*x)^-1的时候会出错
如果特征比样本点还多(n>m),也就是说输入数据的矩阵x不是满秩矩阵,非满秩矩阵在求逆
的时会出现问题,为解决这个问题,专家引入了岭回归的概念。简单来说,岭回归就是在矩阵
X^T*X上加一个λI从而使得矩阵非奇异,进而能对x^T*x+λI求逆。其中I是单位矩阵,λ是用户定

义的一个数值。

岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。Lasso难以求解,但可以使用计算简便的逐步线性回归方法来求得近似的结果

缩减法还可以看作是对一个模型增加偏差的同时减少方差。偏差方差分析折中是一个重要的概念,可以帮助我们理解现有规模并做出改进,从而得到更好的模型

原文地址:https://www.cnblogs.com/zhibei/p/9355907.html

时间: 2024-11-10 21:03:46

线性回归 python小样例的相关文章

SVM python小样例

SVM有很多种实现,但是本章只关注其中最流行的一种实现,即序列最小化(SMO)算法在此之后,我们将介绍如何使用一种称为核函数的方式将SVM扩展到更多的数据集上基于最大间隔的分割数据优点:泛化错误率低,计算开销不大,结果易解释缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题适用数据类型:数值型和标称型数据寻找最大间隔:分割超平面的形式可以写成W^T *x+b,要计算点A到分割超平面的距离,就必须给出点到分割面的法线或垂线的长度,该值为|w^T+b|/||w||.这里的常数

SpringMVC+Spring+Hibernate的小样例

Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hibernate的小样例.凝视都在代码里面. 项目各包的结构例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlhbnR1amF2YQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve

C Tips:显示点阵汉字的小样例

非常简陋的一段小程序,演示怎样显示点阵字库.有时间的时候再详解. #include <stdio.h> #include <stdlib.h> struct HzkInfoStruct { int HzkSelect; int HzkSquare; char * fileName; FILE * file; int martixBytesCount; unsigned char *pMatrix; }; typedef struct HzkInfoStruct HzkInfo; v

【转】以Python为例的Async / Await的编程基础

转, 原文:https://www.cnblogs.com/middleware/p/11996731.html ----------------------------------- 来源:Redislabs 作者:Loris Cro 翻译:Kevin (公众号:中间件小哥) 近年来,许多编程语言都在努力改进它们的并发原语.Go 语言有 goroutines,Ruby 有 fibers,当然,还有 Node.js 帮助普及的 async/await,这是当今使用最为广泛的并发操作类型.在本文中

决策树python实现小样例

我们经常使用决策树处理分类问题,近年来的调查表明决策树也是经常使用的数据挖掘算法K-NN可以完成多分类任务,但是它最大的缺点是无法给出数据的内在含义,决策树的主要优势在于数据形式非常容易理解决策树的优缺点:优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据缺点:可能会产生过度匹配问题适用数据类型:数值型和标称型在构造决策树时,我们需要解决的第一个问题是,当前数据集上哪个特征在划分数据分类时起决定性作用.为了找到决定性的特征,划分出最好的结果,我们必须评估每个特征

Python单例的一种简单写法

最原始的想法就是每个类都重写new方法. class Dog: dog = None def __new__(cls, *args, **kwargs): if cls.dog is None: cls.dog = object.__new__(cls) print('create singleton over') return cls.dog def __init__(self, name): print('init is called') self.name = name # 下面这句话会报

Python——单例设计模式

单例设计模式: 让类创建的对象,在系统中只有唯一的实例, 使用python类内置的__new__()方法实现,__new__()方法在创建对象时会被自动调用,通过重写__new__()方法,使得无论用类型创建多少个对象,内存中都只创建一个对象的实例,此时__new__()方法必须返回此内置函数的调用,及return super().__new__(cls) class MyClass(): # 类属性,记录第一个被创建对象的引用 instance = None def __new__(cls,

Python单例

01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 单例设计模式 目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例 每一次执行 类名() 返回的对象,内存地址是相同的 单例设计模式的应用场景 音乐播放 对象 回收站 对象 打印机 对象 …… 02. __new__ 方法 使用 类名() 创建对象时,Python 的解释器 

Python – 单例实现的多种方法

单例模式就是确保一个类只有一个实例.当你希望整个系统中,某个类只有一个实例时,单例模式就派上了用场.比如,某个服务器的配置信息存在在一个文件中,客户端通过AppConfig类来读取配置文件的信息.如果程序的运行的过程中,很多地方都会用到配置文件信息,则就需要创建很多的AppConfig实例,这样就导致内存中有很多AppConfig对象的实例,造成资源的浪费.其实这个时候AppConfig我们希望它只有一份,就可以使用单例模式. 单例模式是一种软件设计模型.在面向对象编程中,通过单例模型只能创建一