书籍:《机器学习实战》中文版
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中复制的四种情形!)相关推荐

  1. 机器学习基础(三十) —— 线性回归、正则化(regularized)线性回归、局部加权线性回归(LWLR)

    1. 线性回归 线性回归根据最小二乘法直接给出权值向量的解析解(closed-form solution): w=(XTX)−1XTy w=(\mathbf X^T\mathbf X)^{-1}\ma ...

  2. 机器学习(回归五)——线性回归-局部加权线性回归

    前面博客有讲到,样本如果不是线性的可以通过多项式扩展,映射到多维空间来拟合.如此之外,还可以做一个局部加权线性回归(Locally Weighted Linear Regression,LWLR). ...

  3. 机器学习--局部加权线性回归

    文章目录 局部加权线性回归 预测鲍鱼年龄 局部加权线性回归 具体理论见上次笔记<线性回归> 预测鲍鱼年龄 import numpy as npclass LocalWeightedLine ...

  4. 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授

    程序示例–局部加权线性回归 现在,我们在回归中又添加了 JLwr() 方法用于计算预测代价,以及 lwr() 方法用于完成局部加权线性回归: # coding: utf-8 # linear_regr ...

  5. 【机器学习】线性回归之概率解释及局部加权线性回归

    Probabilistic interpretation 我们应该想这样一个问题:当我们讨论回归问题时,我们为什么要最小化平方损失函数?在CS229的课程中,吴恩达教授给我们做了详细的概率解释.现总结 ...

  6. 机器学习:局部加权线性回归(Locally Weighted Linear Regression)

    线性回归 先复习一下线性回归的损失函数: 我们的目标是使该函数最小,用矩阵表示为: 对参数w求导得: 令上式等于0可估计出回归系数w得最优解: 但线性回归往往容易欠拟合,除了使用更复杂得函数拟合,还可 ...

  7. 局部加权线性回归,线性回归高级版

    http://www.cnblogs.com/mooba/p/5947161.html 本来不想乱改别人的,但是他的不对,跑不出来有错误 我自己做了个数据 height weight 1.5 50 1 ...

  8. 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归

    局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归 locally weighted scatterplot smoothing,LOWE ...

  9. 机器学习实战--局部加权线性回归(LWR)

    一 概述 通常情况下的线性拟合不能很好地预测所有的值,因为它容易导致欠拟合(under fitting),比如数据集是 一个钟形的曲线.而多项式拟合能拟合所有数据,但是在预测新样本的时候又会变得很糟糕 ...

最新文章

  1. Excel:如何使用函数实现多表多条件汇总求和
  2. bzoj 3224 普通平衡树 vactor的妙用
  3. binlogignoredb mysql_mysql 主从复制binlog不同步
  4. Integer的==问题
  5. [渝粤教育] 西南科技大学 工程力学 在线考试复习资料
  6. mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy
  7. Android代码命名规范
  8. c#中queue的用法
  9. 理解SVG的viewport,viewBox【1】
  10. LINUX系统下监控DELL服务器硬盘状态
  11. OSEK/VDX网络管理
  12. 【利用python3和微信接口给女朋友做个公众号推送】
  13. SparseLDA算法
  14. 我的Java学习笔记(二)飞机大战小游戏
  15. 有关HTML的小众面试题
  16. 租船题库整理-判断、选择
  17. java---解惑--
  18. HBuilder发行App(Android和ios)
  19. wltp和nedc续航差多少_WLTP续航和NEDC续航差多少
  20. [php-代码审计]百家cms4.14

热门文章

  1. laravel redis_php session 存储到redis里
  2. 穿越障碍物JAVA编程_JAVA 基础编程练习题1 【程序 1 不死神兔】
  3. go语言和php哪个建站好,从0开始Go语言,用Golang搭建网站
  4. SQL Server 2014安装图解
  5. Halcon:立体匹配
  6. php 保護連接字符串,PHP字符串操作
  7. 三年级能用计算机吗,三年级上册第6课:我用计算机写作文
  8. python处理pdf文档_pyPdf - 用Python方便的处理PDF文档
  9. JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
  10. js中的逻辑与()和逻辑或(||)(转载)