欠拟合和过拟合

看下方的三张图

第一幅拟合为了 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. 转:mysqld与mysqld_safe的区别

    mysqld_safe与mysqld区别,直接运行mysqld程序来启动MySQL服务的方法很少见,mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它. 用 ...

  2. IDA+Windbg IDA+OD 连动调试插件

    https://github.com/bootleg/ret-sync 使用注意事项:多次测试,最好现在IDA中启动,然后再在OD或WINDBG(.load sync)中启动. 这个工具还是相当给力的 ...

  3. 计时 答题 demo

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  4. GO与PHP的AES交互,key长度问题

    今天在使用go与php的AES加解密交互中,一直有个问题那就是在go中加密后,在php端始终都是无法解密,经过排查最后发现是加密key长度引起的问题, 这里简单记录下. go的AES使用的是第三方的库 ...

  5. linux安装IB驱动方法

    一.准备 1.Linux操作系统7.6(根据实际情况变更,此处用redhat7.6系统举例) 2.驱动:MLNX_OFED_LINUX-4.6-1.0.1.1-rhel7.6-x86_64.tgz(根 ...

  6. Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

    Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...

  7. Java生鲜电商平台-订单配送模块的架构与设计

    Java生鲜电商平台-订单配送模块的架构与设计 生鲜电商系统最终的目的还是用户下单支付购买, 所以订单管理系统是电商系统中最为复杂的系统,其作为中枢决定着整个商城的运转, 本文将对于生鲜类电商平台的订 ...

  8. 初始HTML_表格

    Html表格 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  9. cmd start命令启动文件的路径

    最近在脚本中通过WScript.Shell执行命令行,实现IE打开Chrome的功能. JS代码如下: var singleurl = window.location.href; var isChro ...

  10. (一)创建新的react native 应用程序

    最近开始学习ReactNative了,首先了解下ReactNative http://wiki.jikexueyuan.com/project/react-native/GettingStarted. ...