机器学习实战——线性回归和局部加权线性回归(含python中复制的四种情形!)
书籍:《机器学习实战》中文版
IDE:PyCharm Edu 4.02
环境:Adaconda3 python3.6
注:本程序相比原书中的程序区别,主要区别在于函数验证和绘图部分。
一、一般线性回归(最小二乘法OLS)
回归系数求解公式:
说明:X矩阵中每一行是一个样本,y是列向量。只有逆矩阵存在的时候使用,必须在代码中进行判断。
from numpy import *
import matplotlib.pyplot as plt
# 自适应数据加载函数
# 不必指定特征数目,
def loadDataSet(fileName): #general function to parse tab -delimited floatsnumFeat = len(open(fileName).readline().split('\t'))-1 #get number of fieldsdataMat = [];labelMat = []with open(fileName) as fr:for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numFeat):lineArr.append(float(curLine[i]))dataMat.append(lineArr)labelMat.append(float(curLine[-1]))return dataMat,labelMat # 返回列表
# xMat:每一行是一个样本
def standRegres(xArr,yArr):xMat = mat(xArr)yMat = mat(yArr).TxTx = xMat.T * xMatif linalg.det(xTx)==0.0: #判断是否可逆print('This matrix is singular,cannot do inverse')returnws = xTx.I * (xMat.T * yMat)return ws #返回矩阵
x,y = loadDataSet('ex0.txt') # 文件中第一列全为1
def test(x,y):# 绘制散点图xMat = array(x)yMat = array(y)ws1 = standRegres(x,y)fig = plt.figure(1)ax = fig.add_subplot(111)ax.scatter(xMat[:,1],yMat.transpose())# 绘制拟合曲线# 排序后在画拟合直线??y_fit = dot(xMat,ws1) # 矩阵乘法# 计算相关序列print(corrcoef(y_fit.transpose(),yMat))ax.plot(xMat[:,1],y_fit,c='r')plt.show()
#print(test(x,y))
二、局部线性加权回归LWLR
线性回归的一个问题是欠拟合,考虑加入一些偏差,降低预测的均方误差。
LWLR方法对待预测的每个点赋予一定的权重,在这样的一个子集上基于最小均方差来进行普通的回归。
因此,会增加计算量,它对每个点做预测时都必须使用整个数据集。
权重常采用“核”函数的方式进行加权,本程序使用高斯核。
说明:等号右边的W表示权重系数。
# 数据加载函数同上
# 局部线性加权回归
# k:高斯核参数
def lwlr(testPoint,xArr,yArr,k=1.0):xMat = mat(xArr)yMat = mat(yArr).Tm = shape(xMat)[0]weights = mat(eye(m))for j in range(m):diffMat = testPoint - xMat[j,:]weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2))xTx = xMat.T * (weights * xMat)if linalg.det(xTx) == 0.0:print('This matrix is singular,cannot do inverse')returnws = xTx.I * (xMat.T * (weights * yMat))return testPoint*ws
#print(lwlr(x[0],x,y,1.0))
def lwlrTest(testArr,xArr,yArr,k=1.0):#获取所有数据的估计值xMat = mat(xArr)yMat = mat(yArr)m,n = shape(xMat)y_fit = zeros(m)for i in range(m):y_fit[i] = lwlr(testArr[i],xArr,yArr,k)# 绘制散点图fig = plt.figure(1)ax = fig.add_subplot(111)ax.scatter(xMat[:,1].flatten().getA(),yMat.getA()) #必须是数组的形式# 绘制拟合曲线# 排序后再画拟合直线srtIndex = xMat[:,1].argsort(axis=0)xSort = xMat[srtIndex][:,0,:]ySort = y_fit[srtIndex]#ax.plot(xMat[:,1],y_fit,c='r') #未排序,曲线明显出错ax.plot(xSort[:,1],ySort,c='r')plt.show()return y_fit
print(lwlrTest(x,x,y,0.03))
注解:
1、绘制图形时报错:Masked arrays must be 1-D
解决:scatter()中参数必须是1-D的array,但plot()总参数可以是矩阵。
ax.scatter(xMat[:,1].flatten().getA(),yMat.getA()) #必须是数组的形式
解释:http://blog.csdn.net/qq_18433441/article/details/54916991
numpy的flatten()可以将二维矩阵变为一维的矩阵,但此时依然是矩阵类型。
from numpy import *
a=[[1,2,3],[4,5,6]]
mat1 = mat(a)
mat2 = mat1.flatten() #依然是matrix类型
mat3 = mat2.getA() # array类型
print(a)
print(mat1)
print(mat2,type(mat2))
print(mat3,type(mat3))
2、copy()方法、引用
具体解释:http://blog.csdn.net/qq_32907349/article/details/52190796
情形一:原对象整体改变
结果:引用后对象和copy()后对象不随原对象而改变
from numpy import *
b1=array([1,2,3,4,5,6])
b2=b1
b3=b1.copy()
b1=b1*2
print(b1)
print(b2)
print(b3)
结果:
[ 2 4 6 8 10 12]
[1 2 3 4 5 6]
[1 2 3 4 5 6]
情形二:原对象部分元素改变
结果:引用对象随原对象改变,copy()后的对象不变
from numpy import *
b1=array([1,2,3,4,5,6])
b2=b1
b3=b1.copy()
b1[0]=100
print(b1)
print(b2)
print(b3)
结果:
[100 2 3 4 5 6]
[100 2 3 4 5 6]
[1 2 3 4 5 6]
情形三:原对象中有子对象情形
结果:子对象变化时,引用后对象和copy()后对象均随原对象而改变。但是,非子对象变化的结果同上。
(1)非子对象改变
b1=[1,2,[3,4]]
b2=b1
b3=b1.copy()
b1[0]=100
print(b1)
print(b2)
print(b3)
结果:
[100, 2, [3, 4]]
[100, 2, [3, 4]]
[1, 2, [3, 4]]
(2)子对象改变
b1=[1,2,[3,4]]
b2=b1
b3=b1.copy()
#b1[0]=100
b1[2][0] = 100
print(b1)
print(b2)
print(b3)
结果:
[1, 2, [100, 4]]
[1, 2, [100, 4]]
[1, 2, [100, 4]]
提示:array()中元素类型必须一致。
比如array([1,2,[3,4]]) 错误
情形四:完全复制
copy库函数之deepcopy(),list无deepcopy属性,因此list.deepcopy()错误!
import copy
b1=[1,2,[3,4]]
b2=b1
b3=b1.copy()
b4=copy.deepcopy(b1)
#b1[0]=100
b1[2][0] = 100
print(b1)
print(b2)
print(b3)
print(b4)
运行结果:
[1, 2, [100, 4]]
[1, 2, [100, 4]]
[1, 2, [100, 4]]
[1, 2, [3, 4]]
3、问题:拟合曲线绘制前必须先对数据线进行排序,否则易出错!!!
未排序绘制的拟合曲线:
排序后再绘制拟合曲线:
机器学习实战——线性回归和局部加权线性回归(含python中复制的四种情形!)相关推荐
- 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)
1. 线性回归 线性回归根据最小二乘法直接给出权值向量的解析解(closed-form solution): w=(XTX)−1XTy w=(\mathbf X^T\mathbf X)^{-1}\ma ...
- 机器学习(回归五)——线性回归-局部加权线性回归
前面博客有讲到,样本如果不是线性的可以通过多项式扩展,映射到多维空间来拟合.如此之外,还可以做一个局部加权线性回归(Locally Weighted Linear Regression,LWLR). ...
- 机器学习--局部加权线性回归
文章目录 局部加权线性回归 预测鲍鱼年龄 局部加权线性回归 具体理论见上次笔记<线性回归> 预测鲍鱼年龄 import numpy as npclass LocalWeightedLine ...
- 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授
程序示例–局部加权线性回归 现在,我们在回归中又添加了 JLwr() 方法用于计算预测代价,以及 lwr() 方法用于完成局部加权线性回归: # coding: utf-8 # linear_regr ...
- 【机器学习】线性回归之概率解释及局部加权线性回归
Probabilistic interpretation 我们应该想这样一个问题:当我们讨论回归问题时,我们为什么要最小化平方损失函数?在CS229的课程中,吴恩达教授给我们做了详细的概率解释.现总结 ...
- 机器学习:局部加权线性回归(Locally Weighted Linear Regression)
线性回归 先复习一下线性回归的损失函数: 我们的目标是使该函数最小,用矩阵表示为: 对参数w求导得: 令上式等于0可估计出回归系数w得最优解: 但线性回归往往容易欠拟合,除了使用更复杂得函数拟合,还可 ...
- 局部加权线性回归,线性回归高级版
http://www.cnblogs.com/mooba/p/5947161.html 本来不想乱改别人的,但是他的不对,跑不出来有错误 我自己做了个数据 height weight 1.5 50 1 ...
- 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归
局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归 locally weighted scatterplot smoothing,LOWE ...
- 机器学习实战--局部加权线性回归(LWR)
一 概述 通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是 一个钟形的曲线.而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕 ...
最新文章
- Excel:如何使用函数实现多表多条件汇总求和
- bzoj 3224 普通平衡树 vactor的妙用
- binlogignoredb mysql_mysql 主从复制binlog不同步
- Integer的==问题
- [渝粤教育] 西南科技大学 工程力学 在线考试复习资料
- mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy
- Android代码命名规范
- c#中queue的用法
- 理解SVG的viewport,viewBox【1】
- LINUX系统下监控DELL服务器硬盘状态
- OSEK/VDX网络管理
- 【利用python3和微信接口给女朋友做个公众号推送】
- SparseLDA算法
- 我的Java学习笔记(二)飞机大战小游戏
- 有关HTML的小众面试题
- 租船题库整理-判断、选择
- java---解惑--
- HBuilder发行App(Android和ios)
- wltp和nedc续航差多少_WLTP续航和NEDC续航差多少
- [php-代码审计]百家cms4.14
热门文章
- laravel redis_php session 存储到redis里
- 穿越障碍物JAVA编程_JAVA 基础编程练习题1 【程序 1 不死神兔】
- go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
- SQL Server 2014安装图解
- Halcon:立体匹配
- php 保護連接字符串,PHP字符串操作
- 三年级能用计算机吗,三年级上册第6课:我用计算机写作文
- python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
- JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
- js中的逻辑与()和逻辑或(||)(转载)