欠拟合和过拟合

看下方的三张图

第一幅拟合为了 y=θ0+θ1xy=θ0+θ1x 的一次函数
第二幅拟合为了y=θ0+θ1x+θ2x2y=θ0+θ1x+θ2x2 的二次函数
第三幅拟合为了 y=∑5j=0θjxjy=∑j=05θjxj的五次项函数

最左边的分类器模型没有很好地捕捉到数据特征,不能够很好地拟合数据,我们称为欠拟合 
而最右边的分类器分类了所有的数据,也包括噪声数据,由于构造复杂,后期再分类的新的数据时,对于稍微不同的数据都会识别为不属于此类别,我们称为过拟合

局部加权回归

局部加权回归是一种非参数学习算法,这使得我们不必太担心对于自变量最高次项的选择

我们知道,对于普通的线性回归算法,想要预测 xx 点的yy值,我们通过:

对于局部加权回归算法,我们通过下列步骤预测 y的值:

这里的 w(i)是权重,它并非一个定值,我们通过调节w(i)的值来确定不同训练数据对结果的影响力,
当w(i)很小时,它对应的y(i)−θTx(i)也很小,对结果的影响也很小;
而当它很大时,其对应的y(i)−θTx(i)也很大,对结果的影响很大。
w(i)的计算方法有很多种,其中一种公式为:

它很像高斯分布,函数图类似下图,要预测的点x对应的中间的顶点处的自变量,可以看出,离xx处越近的地方w(i)值越大,越远的地方w(i)越小,这就使得离x处近的数据对预测结果的影响更大

代码实现

 from numpy import *
import matplotlib.pyplot as plt # 加载数据 返回数据和目标值
def loadDataSet(fileName):
numFeat = len(open(fileName).readline().split('\t')) - 1
dataMat = []; labelMat = []
fr = open(fileName)
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 # 利用公式计算回归系数
def standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat # 公式步骤
if linalg.det(xTx) == 0.0:
print("行列式为0,奇异矩阵,不能做逆")
return
ws = xTx.I * (xMat.T*yMat) #解线性方程组
# ws = linalg.solve(xTx,xMat.T*yMat) # 也可以使用函数来计算 线性方程组
return ws # 局部加权线性回归 返回该条样本预测值
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m))) # 创建为单位矩阵,再mat转换数据格式 因为后面是与原数据矩阵运算,所以这里是为了后面运算且不带来其他影响
for j in range(m): # 利用高斯公式创建权重W 遍历所有数据,给它们一个权重
diffMat = testPoint - xMat[j,:] # 高斯核公式1
weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) # 高斯核公式2 矩阵*矩阵.T 转行向量为一个值 权重值以指数级衰减
xTx = xMat.T * (weights * xMat) # 求回归系数公式1
if linalg.det(xTx) == 0.0: # 判断是否有逆矩阵
print("行列式为0,奇异矩阵,不能做逆")
return
ws = xTx.I * (xMat.T * (weights * yMat)) # 求回归系数公式2
return testPoint * ws # 循环所有点求出所有的预测值
def lwlrTest(testArr,xArr,yArr,k=1.0): # 传入的k值决定了样本的权重,1和原来一样一条直线,0.01拟合程度不错,0.003纳入太多噪声点过拟合了
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i],xArr,yArr,k) # 返回该条样本的预测目标值
return yHat xArr,yArr = loadDataSet('ex0.txt')
# 求所有预测值
yHat = lwlrTest(xArr,xArr,yArr,0.01)
print(yHat)
# 绘制数据点和拟合线(局部加权线性回归)
xMat = mat(xArr)
srtInd = xMat[:,1].argsort(0) # 画拟合线 需要获得所有横坐标从小到大的下标
xSort = xMat[srtInd][:,0,:] # 获得排序后的数据 fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xSort[:,1],yHat[srtInd],color='red')
ax.scatter(xMat[:,1].flatten().A[0],mat(yArr).T.flatten().A[0])
plt.show()

locally weighted regression - CS229的更多相关文章

  1. Locally Weighted Regression

    简单回顾一下线性回归.我们使用了如下变量:\(x\)—输入变量/特征:\(y\)—目标变量:\((x,y)\)—单个训练样本:\(m\)—训练集中的样本数目:\(n\)—特征维度:\((x^{(i)} ...

  2. Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现

    鲁棒局部加权回归 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 算法参考文献: (1) Robust L ...

  3. Locally weighted regression algorithm

    在此引出另一种模型:Locally weighted regression algorithm(LWLR/LWR),通过名字我们可以推断,这是一种更加关注局部变化的模型.的确如此,在普通的linear ...

  4. Locally weighted regression algorithm

    之前所讨论的梯度下降算法,其算法模型是“线性回归模型”,我们可以理解为变量与因变量之间的关系是线性的.而现实情况是,使用线性模型去描述所有数据,很容易出现欠拟合(underfitting)的情况:同样 ...

  5. 局部加权回归、欠拟合、过拟合(Locally Weighted Linear Regression、Underfitting、Overfitting)

    欠拟合.过拟合 如下图中三个拟合模型.第一个是一个线性模型,对训练数据拟合不够好,损失函数取值较大.如图中第二个模型,如果我们在线性模型上加一个新特征项,拟合结果就会好一些.图中第三个是一个包含5阶多 ...

  6. Locally weighted linear regression(局部加权线性回归)

    (整理自AndrewNG的课件,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 前面几篇博客主要介绍了线性回归的学习算法,那么它有什么不足的地方么 ...

  7. 局部权重线性回归(Locally weighted linear regression)

    在线性回归中,因为对參数个数选择的问题是在问题求解之前已经确定好的,因此參数的个数不能非常好的确定,假设參数个数过少可能拟合度不好,产生欠拟合(underfitting)问题,或者參数过多,使得函数过 ...

  8. Locally Weighted Linear Regression 局部加权线性回归-R实现

      局部加权线性回归  [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 线性回归容易出现过拟合或欠拟合的问 ...

  9. 局部加权线性回归(Locally weighted linear regression)

    首先我们来看一个线性回归的问题,在下面的例子中,我们选取不同维度的特征来对我们的数据进行拟合. 对于上面三个图像做如下解释: 选取一个特征,来拟合数据,可以看出来拟合情况并不是很好,有些数据误差还是比 ...

随机推荐

  1. [01]从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍

    从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新 ...

  2. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  3. 创建WPF项目

    参考: https://www.cnblogs.com/yhcao/p/6237611.html https://mahapps.com/guides/reporting-issues.html ht ...

  4. js获取当前日期一年的第几周

    获取当前日期一年中的第几周 function theWeek() { ; now = new Date(); years = now.getYear() ) years += ); days[] = ...

  5. Google在情报搜集中的基础技巧

    Google在情报搜集中的基础技巧 作者:王宇阳 时间:2019-06-06 作者笔记 ​ Google Hacking 是指使用特定的高级的google搜索语法,收集渗透测试目标的信息,查找目标的配 ...

  6. 一文解读VR/AR/MR (转)

    1.VR=虚拟世界 VR,英文是Virtual Reality,中文是虚拟现实. VR眼镜 再细节一点来说,就是模拟一个三维的虚拟世界,在这个虚拟世界中,人们可以感受到视觉.听觉.触觉等方面的刺激. ...

  7. 浅入浅出 Go 语言接口的原理

    浅入浅出 Go 语言接口的原理 接口是 Go 语言的重要组成部分,它在 Go 语言中通过一组方法指定了一个对象的行为,接口 interface 的引入能够让我们在 Go 语言更好地组织并写出易于测试的 ...

  8. 安装quickLook插件以及解决如何不能读取offic问题

    目录 @(安装quickLook插件) quickLook插件是Mac上的快速浏览的一个功能,现在win10系统上也能安装插件,这个插件可以快速浏览txt,doc,图片,表格等文件如下图: 我认为最方 ...

  9. [Flink]测试用的fake温度传感器

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  10. win10连接共享打印机

    一.在运行中输入“\\共享打印机的主机ip”. 二.如果出现下面弹窗: 1.按Win键弹出开始菜单,直接在键盘上按zucelue,这个时候开始菜单里会检索到“编辑组策略”这个程序,按回车运行该程序.2 ...