python线性加权模型_局部加权之线性回归(1) - Python实现

1 #局部加权线性回归

2 #交叉验证计算泛化误差最小点

3

4

5 importnumpy6 from matplotlib importpyplot as plt7

8

9 #待拟合不含噪声之目标函数

10 deforiFunc(x):11 y = numpy.exp(-x) * numpy.sin(10*x)12 returny13 #待拟合包含噪声之目标函数

14 def traFunc(x, sigma=0.03):15 y = oriFunc(x) +numpy.random.normal(0, sigma, numpy.array(x).size)16 returny17

18

19 #局部加权线性回归之实现

20 classLW(object):21

22 def __init__(self, xBound=(0, 3), number=500, tauBound=(0.001, 100), epsilon=1.e-3):23 self.__xBound = xBound #采样边界

24 self.__number = number #采样数目

25 self.__tauBound = tauBound #tau之搜索边界

26 self.__epsilon = epsilon #tau之搜索精度

27

28

29 defget_data(self):30 '''

31 根据目标函数生成待拟合数据32 '''

33 X = numpy.linspace(*self.__xBound, self.__number)34 oriY_ = oriFunc(X) #不含误差之响应

35 traY_ = traFunc(X) #包含误差之响应

36

37 self.X = numpy.vstack((X.reshape((1, -1)), numpy.ones((1, X.shape[0]))))38 self.oriY_ = oriY_.reshape((-1, 1))39 self.traY_ = traY_.reshape((-1, 1))40

41 returnself.X, self.oriY_, self.traY_42

43

44 def lw_fitting(self, tau=None):45 if not hasattr(self, "X"):46 self.get_data()47 if tau isNone:48 if hasattr(self, "bestTau"):49 tau =self.bestTau50 else:51 tau =self.get_tau()52

53 xList, yList =list(), list()54 for val in numpy.linspace(*self.__xBound, self.__number * 5):55 x = numpy.array([[val], [1]])56 theta = self.__fitting(x, self.X, self.traY_, tau)57 y =numpy.matmul(theta.T, x)58 xList.append(x[0, 0])59 yList.append(y[0, 0])60

61 resiList = list() #残差计算

62 for idx in range(self.__number):63 x = self.X[:, idx:idx+1]64 theta = self.__fitting(x, self.X, self.traY_, tau)65 y =numpy.matmul(theta.T, x)66 resiList.append(self.traY_[idx, 0] -y[0, 0])67

68 returnxList, yList, self.X[0, :].tolist(), resiList69

70

71 defshow(self):72 '''

73 绘图展示整体拟合情况74 '''

75 xList, yList, sampleXList, sampleResiList =self.lw_fitting()76 y2List =oriFunc(numpy.array(xList))77 fig = plt.figure(figsize=(8, 14))78 ax1 = plt.subplot(2, 1, 1)79 ax2 = plt.subplot(2, 1, 2)80

81 ax1.scatter(self.X[0, :], self.traY_[:, 0], c="green", alpha=0.7, label="samples with noise")82 ax1.plot(xList, y2List, c="red", lw=4, alpha=0.7, label="standard curve")83 ax1.plot(xList, yList, c="black", lw=2, linestyle="--", label="fitting curve")84 ax1.set(xlabel="$x$", ylabel="$y$")85 ax1.legend()86

87 ax2.scatter(sampleXList, sampleResiList, c="blue", s=10)88 ax2.set(xlabel="$x$", ylabel="$\epsilon$", title="residual distribution")89

90 plt.show()91 plt.close()92 fig.tight_layout()93 fig.savefig("lw.png", dpi=300)94

95

96 def __fitting(self, x, X, Y_, tau, epsilon=1.e-9):97 tmpX = X[0:1, :]98 tmpW = (-(tmpX - x[0, 0]) ** 2 / tau ** 2 / 2).reshape(-1)99 W =numpy.diag(numpy.exp(tmpW))100

101 item1 =numpy.matmul(numpy.matmul(X, W), X.T)102 item2 = numpy.linalg.inv(item1 + epsilon *numpy.identity(item1.shape[0]))103 item3 =numpy.matmul(numpy.matmul(X, W), Y_)104

105 theta =numpy.matmul(item2, item3)106

107 returntheta108

109

110 defget_tau(self):111 '''

112 交叉验证返回最优tau113 采用黄金分割法计算最优tau114 '''

115 if not hasattr(self, "X"):116 self.get_data()117

118 lowerBound, upperBound = self.__tauBound

119 lowerTau = self.__calc_lowerTau(lowerBound, upperBound)120 upperTau = self.__calc_upperTau(lowerBound, upperBound)121 lowerErr = self.__calc_generalErr(self.X, self.traY_, lowerTau)122 upperErr = self.__calc_generalErr(self.X, self.traY_, upperTau)123

124 while (upperTau - lowerTau) > self.__epsilon:125 if lowerErr >upperErr:126 lowerBound =lowerTau127 lowerTau =upperTau128 lowerErr =upperErr129 upperTau = self.__calc_upperTau(lowerBound, upperBound)130 upperErr = self.__calc_generalErr(self.X, self.traY_, upperTau)131 else:132 upperBound =upperTau133 upperTau =lowerTau134 upperErr =lowerErr135 lowerTau = self.__calc_lowerTau(lowerBound, upperBound)136 lowerErr = self.__calc_generalErr(self.X, self.traY_, lowerTau)137

138 self.bestTau = (upperTau + lowerTau) / 2

139 returnself.bestTau140

141

142 def __calc_generalErr(self, X, Y_, tau):143 generalErr =0144

145 for idx in range(X.shape[1]):146 tmpx = X[:, idx:idx+1]147 tmpy_ = Y_[idx:idx+1, :]148 tmpX = numpy.hstack((X[:, 0:idx], X[:, idx+1:]))149 tmpY_ = numpy.vstack((Y_[0:idx, :], Y_[idx+1:, :]))150

151 theta = self.__fitting(tmpx, tmpX, tmpY_, tau)152 tmpy =numpy.matmul(theta.T, tmpx)153 generalErr += (tmpy_[0, 0] - tmpy[0, 0]) ** 2

154

155 returngeneralErr156

157

158 def __calc_lowerTau(self, lowerBound, upperBound):159 delta = upperBound -lowerBound160 lowerTau = upperBound - delta * 0.618

161 returnlowerTau162

163

164 def __calc_upperTau(self, lowerBound, upperBound):165 delta = upperBound -lowerBound166 upperTau = lowerBound + delta * 0.618

167 returnupperTau168

169

170

171

172 if __name__ == '__main__':173 obj =LW()174 obj.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3分钟看完 Day2 Keynote

hey~ M姐又给大家带来了满满惊喜的 Build2016 Day 2 Keynote 干货汇总了。 如果你连昨天的都还不知道,那真心就 out 了。如果说信仰在昨天充值爆棚,今天就要充值信仰到掀翻房顶的节奏了!!! 红衣主教今天妥妥变身成为新…

latex 数学公式_技能分享——LaTeX篇I

公众号文章系列二——“小袁技能分享”上线啦,第一篇推文我们聊一聊LaTeX(音译 “拉泰赫”)Question 1什么是LaTeX?要解释LaTeX是什么,我们先要了解另外一个事物:TeX。1968年,美国著名计算机科学家、现代计算机科学的先…

转:springboot servlet使用配置

转自: springboot servlet使用配置_奔跑的蜗牛的博客-CSDN博客在spring boot中添加自己的Servlet有两种方法,代码注册Servlet和注解自动注册(Filter和Listener也是如此)。 一、代码注册通过ServletRegistrationBean 获得控制。 也…

前端面试常考系列五

转载自 前端面试常考五 一、DIV元素是什么 DIV元素是用来为HTML文档内大块(block-level)的内容提供结构和背景的元素。DIV的起始标签和结束标签之间的所有内容都是用来构成这个块的,其中所包含元素的特性由DIV标签的属性来控制,或…

从业十余年谈谈对dotnet看法与坚持

前言 园子经常在讨论关于.Net发展的问题,我也这些年在工作乃至创业过程中使用.Net碰到的一些问题和看法。个人擅长的技术面,C/C/MFC/STL、ASM、JAVA、VB、Javascript/Typescript、C#/WebForm/MVC、Android/MonoDroid,Linux/Windows,还有没有可…

kali安装python3.7_Debian服务器之安装Python3.7

1、系统环境介绍1.1 系统版本debian-9.6.0-amd64-netinst1.2 系统内核Linux lnnkee 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 GNU/Linux2、下载安装包https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz3、配置安装环境apt install libffi-dev …

org.apache.kafka.common.errors.TimeoutException: Topic not present in metadata 解决方法

【README】 本文po出了 topic not present in metadata 的解决方法; 很多博文说是 因为 jackson-databind 没有引入,但是我重新引入后,还是没有解决问题; 最后,原因在于我要发送消息的分区,topic 没有对…

前端面试常考系列六

转载自 前端面试常考系列六 一、为什么重置浏览器默认样式,如何重置 每种浏览器都有一套默认的样式表,即user agent stylesheet,网页在没有指定的样式时,按浏览器内置的样式表来渲染。这是合理的,像word中也有一些预留…

Microsoft将Linux带至桌面操作系统

在今天的Build大会上Microsoft宣布:今年的Windows 10年度更新将使得Windows 10系统能够无缝运行Linux二进制程序。多年来,专家与开发者都在猜测,Linux如何以及何时才能在普通PC用户的桌面系统中更加流行。从今天的新闻来看,似乎Mi…

kafka控制器,复制与存储小结

【README】 1,本文主要总结kafka复制,存储细节;2,本文的kafka集群版本是3.0.0, 有3个broker,分别是 centos201, centos202, centos203 对应的brokerid为 1, 2, 3 ;【1】kafka内部原…

python开发stm32软件_ADB+Python+STM32 实现 微信跳一跳辅助

说明:安卓手机开启USB调试模式,具体如何开启,百度自己手机即可安装ADB工具安装python2.7步骤:1、安装adb工具下载地址:https://download.csdn.net/download/qq_29769263/10420731下载后解压到便于记忆的地方即可,以解压…

不装mono,你的.NET程序照样可以在Linux上运行

让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过”mono your.exe“命令运行这个程序。 这种运行.net程序的办法有两个弱点,一个是需要客户机安装mono,二个是 ”mono xx.exe“ 这种命令行总让人感到有点…

JAVA面试常考系列一

转载自 JAVA面试常考系列一 题目一 什么是Java虚拟机?为什么Java被称为平台无关的编程语言? java虚拟机是一个可以执行字节码文件(.class)的虚拟机进程。 为什么java与平台无关呢?因为java源程序(.java&…

转:运维监控系统-监控项及指标的梳理

转自: 运维监控系统-监控项及指标的梳理_程序员杂谈-CSDN博客_运维监控指标综合监控功能工具 综合监控工具完成对被管对象的集中监控、集中维护和集中管理,被管对象包括网络设备、服务器、PC设备、数据库、中间件、存储、备份、安全设备、应用系统等。工…

圆心角 圆弧上点坐标_数控加工中心CNC的G02/G03圆弧指令的I、J、与R的区别

G02:顺(CW)圆弧插补G03:逆(CCW)圆弧插补根据所选择的X、Y平面,指令格式如下两种:G17 G02/G03 X_ Y_ I_ J_ F_;G17 G02/G03 X_ Y_ R_ F_;定义方式:依右手坐标系统&#xf…

AutoMapper 使用实践

一. 使用意图 常常在开发过程中,碰到一个实体上的属性值,要赋值给另外一个相类似实体属性时,且属性有很多的情况。一般不利用工具的话,就要实例化被赋值实体B,然后再将实体A的字段一个个赋值给B的属性,单…

kafka可靠数据传递

【README】 本文阐述了kafka可靠消息传递机制; 本文部分内容总结于《kafka权威指南》(一本好书,墙裂推荐),再加上自己的理解; 【1】可靠性保证 1,在讨论可靠性时,一般使用保证这个…

JAVA面试常考系列二

转载自 JAVA面试常考系列二 题目一 解释一下线程和进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上…

雨滴桌面时间插件_Win10美化向——如何搭配你的桌面

// 2020-02-11 //桌面这个东西大家肯定不陌生了,很多人的桌面都如下。_______滑动查看更多图片这多重水印是什么鬼?????还有很多网友呢,也美化了一下自己的桌面。不过呢严格来说,这应…

python画建筑_专题 | Python 绘图入门

我的施工之路Python 绘图入门这是施工系列第18篇,同时也进入到一个新的阶段:Python绘图篇。作为绘图模块的第一篇,与大家一起过过最基本的Python绘图原理。掌握基本的绘图原理很有必要,各个常用绘图库的原理基本都是相通的。所以了…