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

article/2025/9/28 0:23:38

一 概述

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

局部加权回归(LWR)是非参数学习方法。 首先参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的训练数据了,参数值是确定的。而非参数学习方法是这样一种算法:在预测新样本值时候每次都会重新训练数据得到新的参数值,也就是说每次预测新样本都会依赖训练数据集合,所以每次得到的参数值是不确定的。

具体的介绍在我之前的斯坦福机器学习笔记(一)中有详细介绍。链接为:http://blog.csdn.net/qq_30091945/article/details/61615501

这次运用的数据是来自《机器学习实战》这本书中第八章ex0文件中的数据。

二 代码

import numpy as np
import matplotlib.pyplot as pltdef LoadDataSet(file):""":param file:文件路径:return: 返回测试数据与标签"""ftrain = open(file)trainingset = []labelset = []for line in ftrain.readlines():LineArr = line.strip().split('\t')trainingset.append([float(LineArr[0]),float(LineArr[1])])labelset.append(float(LineArr[2]))return trainingset, labelsetdef LWRTest(traingxarr,xarr,yarr,k):Xmat = np.mat(xarr)Ymat = np.mat(yarr)# m是输入数据的个数,weights是单位矩阵m = np.shape(Xmat)[0]weights = np.eye(m)for i in range(m):diffmat = traingxarr - Xmat[i,:]weights[i,i] = np.exp(-(diffmat*diffmat.transpose())/(2.0*k**2))XT = Xmat.transpose()*(weights*Xmat)if np.linalg.det(XT) == 0:              #矩阵的行列式为0时不能进行之后的计算print('This Matrix is singular, cannot do inverse')return#theta是回归系数theta = XT.I*Xmat.transpose()*(weights*Ymat.transpose())ytest= traingxarr*thetareturn ytestdef LWR(trainingset,xarr,yarr,k):""":param trianingset:训练数据集:param xarr: 输入样本的横坐标:param yarr: 输入样本的纵坐标:param k: 带宽参数:return:返回预测值"""# m是输入数据的个数,weights是单位矩阵m = np.shape(trainingset)[0]ytest = np.zeros(m)for i in range(m):ytest[i] = LWRTest(trainingset[i],xarr,yarr,k)return  ytestdef Show(xarr,yarr,ytest,k):""":param xarr: 样本数据特征值:param ytest: LWR回归得到的预测:param yarr: 样本数据标记值"""xmat = np.mat(xarr)strInd = xmat[:, 1].argsort(0)xSort = xmat[strInd][:, 0, :]fig = plt.figure()ax = fig.add_subplot(1,1,1)ax.plot(xSort[:, 1], ytest[strInd])ax.scatter(xmat[:, 1].flatten().A[0], np.mat(yarr).T.flatten().A[0], s=2, c='red')title = "k = "title += str(k)ax.set_title(title)plt.savefig("D:\\Program Files (x86)\\机器学习\\斯坦福大学机器学习\\中文笔记\\Linear Regression\\LWR\\"+title+".jpg",dpi=400,bbox_inches='tight')plt.show()def run_main():"""这是主函数"""file = 'D:\\Program Files (x86)\\机器学习\\机器学习实战\\源代码\\Ch08\\ex0.txt'xarr,yarr = LoadDataSet(file)k = [1.0,0.01,0.003]for i in k:ytest = LWR(xarr,xarr,yarr,i)Show(xarr,yarr,ytest,i)if __name__ == '__main__':run_main()

下面是将上述代码利用面向对象程序设计进行重写的Python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/8/1614:07
# @Author  : DaiPuWei
# E-Mail   : 771830171@qq.com
# @Site    : 
# @File    : LWR.py
# @Software: PyCharmimport numpy as np
import matplotlib as mpl
import matplotlib.pyplot as pltclass LWR:def __init__(self,train_data,train_predict):"""这是局部加权回归的构造函数:param train_data: 训练数据集:param train_predict: 训练数据集对应的预测值"""self.Train_Data = train_dataself.Train_Predict = train_predictdef Gaussian_Weight(self,data,k):"""这是计算测试数据data高斯核函数:param data: 预测数据:param k: 带宽系数"""# data的数据类型是np.array,那么利用dot方法进行矩阵运算的结果是矩阵,哪怕只有一个元素sum = np.sum(data*data)return np.exp(sum/(-2*k*k))def predict(self,test_data,k):"""这是预测测试数据结果的函数:param test_data:测试数据:param k: 带宽系数"""size = np.shape(self.Train_Data)[0]weights = np.zeros((size,size))for i in range(size):diff = test_data-self.Train_Data[i]weights[i,i] = self.Gaussian_Weight(diff,k)XT = self.Train_Data.T.dot(weights)inv = np.linalg.inv(XT.dot(self.Train_Data))theta = inv.T.dot(XT.dot(self.Train_Predict))test_predict = np.sum(theta.T*test_data)return test_predictdef Test(self,Test_Data,k):Test_Predict = []for test_data in Test_Data:test_predict = self.predict(test_data,k)Test_Predict.append(test_predict)Test_Predict = np.array(Test_Predict)return Test_Predictdef LoadDataSet(file):'''导入西瓜数据'''ftrain = open(file)trainingset = []labelset = []for line in ftrain.readlines():LineArr = line.strip().split('\t')trainingset.append([float(LineArr[0]),float(LineArr[1])])labelset.append(float(LineArr[2]))trainingset = np.array(trainingset)labelset = np.array(labelset).reshape((len(labelset),1))return trainingset, labelsetdef run_main():"""这是主函数"""path = "./ex0.txt"trainingset, labelset = LoadDataSet(path)# 解决画图是的中文乱码问题mpl.rcParams['font.sans-serif'] = [u'simHei']mpl.rcParams['axes.unicode_minus'] = FalseK = [1.0,0.1,0.01,0.003]for k in K:lwr = LWR(trainingset,labelset)testpredict = lwr.Test(trainingset,k)plt.scatter(trainingset[:,1],labelset,s =2,c='red')index = trainingset[:, 1].argsort(0)xdata = trainingset[index][:,1]plt.plot(xdata,testpredict[index],'b')plt.title("k=%f"%(k))plt.savefig("k=%f.jpg"%(k))plt.show()plt.close()if __name__ == '__main__':run_main()

下面是模型运行结果如下:
k = 1.0 (欠拟合)

这里写图片描述
k = 0.01(最佳拟合)
这里写图片描述
k = 0.003(过拟合)
这里写图片描述


http://chatgpt.dhexx.cn/article/ZMSq4JxM.shtml

相关文章

机器学习与算法(8)--局部加权学习算法(LWR)

局部加权学习算法(LWR) 局部加权回归(LWR)是非参数学习方法。 首先参数学习方法是这样一种方法:在训练完成所有数据后得到一系列训练参数,然后根据训练参数来预测新样本的值,这时不再依赖之前的…

局部加权回归

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

冲击波理论

冲击波理论 冲击波理论(the kinematic wave theory,也称LWR理论)最初是由Lighthill, M. J和Whitham, G. B. 以及Richards, P. I. 于上世纪50年代提出的。该理论假设车流是一种类似于水流的运动,可以通过流量、密度和速度之间的关…

IOS捷径|九宫格切图工具 分享

还在为切九宫格图片找来找去找不到好工具而烦恼? 快使用九宫格切图快捷指令,5秒切出你想要的效果 为保障更好的切图效果,轻使用正方形图片参与切图,如没有,也请尽量裁剪出正方形图片再参与切图 支持22、23、3*3 多种组合方式 …

canvas切割原图为九宫格图片

originUrl 图片原地址cWidth 生成图片的宽度cHeight 生成图片的高度top 第一条切割线距离原图片顶部的距离bottom 第二条切割线距离原图片底部的距离left 第三条切割线距离原图片左侧的距离right 第四条切割线距离原图片右侧的距离 切割 效果图 index.html <!DOCTYPE html…

Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息

Unity的UGUI用TexturePacker全自动打图集&#xff0c;包括九宫格切图信息 前言环境准备实现过程注意总结版权声明 前言 最近在学习UGUI的打图集&#xff0c;之前一直在用SpritePacker和Sprite Atlas打图集&#xff0c;现在记录下另一种打图集方式&#xff1a;TexturePacker 主…

NGUI 九宫格切图

UISprite 的 Type 选择 Sliced 选择Edit 中的 Border

关于9宫格拼图,C++

该文章均为个人编写&#xff0c;如有错误&#xff0c;欢迎各位友友点评&#xff01; 一个简单的小游戏&#xff0c;使用到指针及一二维数组&#xff0c;相关知识可访问&#xff1a; 指针&#xff1a;https://blog.csdn.net/qiu___nan/article/details/127054411。 数组&…

html用九张图片做出九宫图,用ps如何将九张照片做成九宫格?

如何用PS将九张照片做成九宫格&#xff0c;并且随时可以更换呢。下面跟搞设计一起来做一下吧。 ↑ 首先准备好九张照片 ↑ 打开PS&#xff0c;新建一个1000x1000的文件 ↑ 选择矩形工具 ↑ 创建一个300x300的矩形 ↑ 随便填个颜色&#xff0c;把图层命名为1 ↑ 选择视图-新建参…

python将图片裁剪成九宫格

要求&#xff1a;将图片裁剪成九宫格&#xff0c;宫格图片位置打乱 思路&#xff1a; 判断该图片长宽是否能被3整除&#xff0c;不能需要对图片进行裁剪&#xff08;我的是边角裁剪&#xff09;双重for循环&#xff0c;根据步长对图片数组进行切片达到裁剪效果random.shuffle(…

html手机9张图片显示,怎么把一张图片分成9张(手机美图秀秀九宫格在哪)

手机拍照片咋做成九宫格&#xff1f;只需4步&#xff0c;这么发朋友圈真好看&#xff01; 国庆中秋双节已过&#xff0c;你拍了照片吗&#xff1f;很多朋友拍了照片后&#xff0c;喜欢发朋友圈分享。 今天教大家一招&#xff0c;让你发的朋友圈更好看&#xff0c;用手机就能完成…

九宫格拼图

九宫格拼图的实现&#xff1a; 效果为下图所示&#xff0c;实现拼图的完成&#xff0c;这里附上完整的代码&#xff0c;需要注意的是在产生随机的初始状态时&#xff0c;是随机两两交换&#xff0c;才能保证其一直是1-9的这样的情况&#xff0c;其他具体响应的设计在程序注释中…

Python切割九宫格图

Python切割九宫格图 朋友圈经常有人发九宫格图片&#xff0c;但那是使用特定的图片软件制成的或就是九章不同的照片本次我们用 Python 来制一张 九宫格主体是一个 3x3 的正方形矩阵 有9张对应的图片组成一般的软件&#xff0c;在遇到非矩阵型图片时难以完成重组&#xff0c;且…

边框图片_九宫格切图

边框图片 原理示意图&#xff1a; 九宫格切图法,保留四个角边框样式,拉伸平铺或环绕方式设置图片四条边.以达到边框样式相同大小可以改变的效果 组合写法&#xff1a; border-image: url("images/border.jpg") 167/20px round;拆分写法&#xff1a; border-image…

python和C++代码实现图片九宫格切图程序(附VS2015配置Opencv教程)

1、python代码实现图片分割成九宫格 需要包含的库&#xff0c;没有下载安装的&#xff0c;需要自己安装哦。 实现原理很简单&#xff0c;就是用PIL库不断画小区域&#xff0c;切下来存储成新的小图片。 假设每一个格子的宽和高分别是w、h&#xff0c;那么第row行&#xff08…

android九宫格切图,拼图九宫格切图app

拼图九宫格切图app是一款比较不错的手机九宫格照片编辑拼图软件&#xff0c;任意选择需要切割的图片&#xff0c;切割成九宫格拼图&#xff0c;轻松制作&#xff0c;喜欢发朋友圈的朋友们有福了&#xff0c;还可以自定义美化滤镜选择&#xff0c;添加文字&#xff0c;贴纸等&am…

赛效:电脑在线九宫格切图怎么制作?

九宫格切图的好处是提高作品的美观度&#xff0c;九宫格切图可以将原本散乱的图片元素进行有序的排列&#xff0c;使作品更具美感&#xff0c;提高观众的观赏体验。另外&#xff0c;还能增强作品的可读性&#xff0c;九宫格切图可以将作品中的主体与背景进行分离&#xff0c;使…

用canvas实现九宫格切图之手把手教学(uniapp+ts)

uniapp用canvas实现九宫格切图&#xff08;typescript&#xff09; 前言上传图片展示图片画布下载图片最终效果总结 前言 这几天工作比较轻松&#xff0c;所以就有时间发下呆&#xff0c;突然想起前段时间用了一个九宫格切图软件&#xff0c;所以就自己试着开发下&#xff0c;…

PS把图片切成九宫格

目录 PS把图片切成九宫格第一步&#xff0c;导入图片到PS第二步&#xff0c;设置裁剪第三步&#xff0c;导出第四步&#xff0c;效果图 PS把图片切成九宫格 PS把图片切成九宫格,把图片设置切片&#xff0c;不仅可以切成九宫格&#xff0c;也可以设置22&#xff0c;44&#xff0…