数据拟合:多项式拟合polynomial curve fitting
http://blog.csdn.net/pipisorry/article/details/49804441
常见的曲线拟合方法
1.使偏差绝对值之和最小

2.使偏差绝对值最大的最小

3.使偏差平方和最小

按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。
多项式拟合
多项式拟合公式
多项式阶数对数据拟合的影响
数据量较少,阶数过高,可能过拟合。
多项式拟合问题描述
假定给定一个训练数据集:
其中,是输入的观测值,是相应的输出y的观测值,,多项式函数拟合的任务是假设给定数据由次多项式函数生成,选择最有可能产生这些数据的次多项式函数,即在次多项式函数中选择一个对已知数据以及未知数据都有很好预测能力的函数。
设次多项式为,式中式单变量输入,是个参数。
参数W求解1
{实际上是一个最小二乘法多项式曲线拟合问题,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。}
用平方损失作为损失函数,系数是为了方便计算,将模型与训练数据代入,有
对求偏导并令其为
所以要求拟合多项式系数需要解下面这个线性方程组,求和符号上下限都是到。
所以计算出和然后将这些值带入上述线性方程组求解即可。
但是上面这个矩阵方程组求解是可以化简的:
参数求解2
{实际上是一个最小二乘法多项式曲线拟合问题,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。}
1. 设拟合多项式为:

2. 各点到这条曲线的距离之和,即偏差平方和如下:

3. 为了求得符合条件的a值,对等式右边求ai偏导数,因而我们得到了:


.......

4. 将等式左边进行一下化简,然后应该可以得到下面的等式:


.......

5. 把这些等式表示成矩阵的形式,就可以得到下面的矩阵:

6. 将这个范德蒙得矩阵化简后可得到:

7. 也就是说X*A=Y,那么A = (X'*X)-1*X'*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。
这里的X就是6中方程左边的矩阵
多项式拟合的python代码实现
{注意安装相关python库}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = '多项式曲线拟合'
__author__ = '皮'
__mtime__ = '11/8/2015-008'
__email__ = 'pipisorry@126.com'
"""
import numpy as np
import matplotlib.pyplot as plt
from scipy import linalg, stats
# 要拟合的函数
func = lambda x: np.sin(2 * np.pi * x)
def genPoints(p_no):
'''
获取要拟合的模拟数据
'''
x = np.random.rand(p_no)
# x = np.linspace(0, 1, 10)
# y要加上一个高斯分布N(0,0.01)随机偏差
, )
return x, y
def drawCurveFitting(ax, w, x, y, order):
'''
绘制拟合曲线
'''
def drawSinCurve(ax):
, , )
y = func(x)
ax.plot(x, y, '--', alpha=0.6, label='sin curve')
drawSinCurve(ax)
def drawOriginData(ax, x, y):
ax.scatter(x, y)
drawOriginData(ax, x, y)
def drawFittingCurve(ax, w, order):
, , )
X )] for xi in x])
y = X.dot(w)
ax.plot(x, y, 'r', label='polynomial fitting curve')
, )
drawFittingCurve(ax, w, order)
def plotSetting(ax):
ax.legend(loc='lower right')
# plt.title('Polynomial Curve Fitting')
# plt.xlabel('x')
# plt.ylabel('y',rotation='horizontal')
ax.set_title('Polynomial Curve Fitting')
ax.set_xlabel('x', rotation='horizontal', lod=True)
ax.set_ylabel('y', rotation='horizontal', lod=True)
plotSetting(ax)
plt.show()
def polynomialFit(x, y, order):
)] for xi in x])
Y , ))
# W = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)
W, _, _, _ = linalg.lstsq(X, Y)
# print(W)
return W
if __name__ == '__main__':
order = 3 # 拟合多项式的阶数
p_no = 10 # 拟合的数据点的个数
)
x, y = genPoints(p_no)
# print(x, '\n', y)
W = polynomialFit(x, y, order=order)
drawCurveFitting(ax, W, x, y, order=order)
运行结果
from:http://blog.csdn.net/pipisorry/article/details/49804441
ref:李航《统计学习方法》
数据拟合:多项式拟合polynomial curve fitting的更多相关文章
- 一起啃PRML - 1.1 Example: Polynomial Curve Fitting 多项式曲线拟合
一起啃PRML - 1.1 Example: Polynomial Curve Fitting @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ 前言: ...
- 【PRML读书笔记-Chapter1-Introduction】1.1 Example:Polynomial Curve Fitting
书中给出了一个典型的曲线拟合的例子,给定一定量的x以及对应的t值,要你判断新的x对应的t值多少. 任务就是要我们去发现潜在的曲线方程:sin(2πx) 这时就需要概率论的帮忙,对于这种不确定给t赋何值 ...
- [PR & ML 2] [Introduction] Example: Polynomial Curve Fitting
啊啊啊,竟然不支持latex,竟然HTML代码不能包含javascript,代码编辑器也不支持Matlab!!!我要吐槽博客的编辑器...T_T只能贴图凑合看了,代码不是图,但这次为了省脑细胞,写的不 ...
- 数据的平面拟合 Plane Fitting
数据的平面拟合 Plane Fitting 看到了一些利用Matlab的平面拟合程序 http://www.ilovematlab.cn/thread-220252-1-1.html
- 最小二乘法多项式拟合的Java实现
背景 由项目中需要根据一些已有数据学习出一个y=ax+b的一元二项式,给定了x,y的一些样本数据,通过梯度下降或最小二乘法做多项式拟合得到a.b,解决该问题时,首先想到的是通过spark mllib去 ...
- 利用Python进行多项式拟合
多项式拟合的简单代码: import matplotlib.pyplot as plt import numpy as np x=[,,,,,,,] y=[,,,,,,,] a=np.polyfit( ...
- python多项式拟合:np.polyfit 和 np.polyld
python数据拟合主要可采用numpy库,库的安装可直接用pip install numpy等. 1. 原始数据:假如要拟合的数据yyy来自sin函数,np.sin import numpy as ...
- matlab练习程序(最小二乘多项式拟合)
最近在分析一些数据,就是数据拟合的一些事情,用到了matlab的polyfit函数,效果不错. 因此想了解一下这个多项式具体是如何拟合出来的,所以就搜了相关资料. 这个文档介绍的还不错,我估计任何一本 ...
- numpy多项式拟合
关于解决使用numpy.ployfit进行多项式拟合的时候请注意数据类型,解决问题的思路就是统一把数据变成浮点型,就可以了.这是numpy里面的一个bug,非常low希望后面改善. # coding: ...
随机推荐
- FastDFS+Nginx安装配置
下载相关包: libevent-2.0.22-stable.tar.gz => https://github.com/libevent/libevent/releases/download/re ...
- Redis出现多线程调用时抛出 [B cannot be cast to java.lang.Long] 异常
原因分析: 多个线程同时调用了同一个jedis对象,导致内存数据被多个线程竞争,产生数据混乱 (或者大家都用通一个redis获取同一个实例,登录同一个账号使用缓存时报错) 解决方案:每个线程都new出 ...
- AleNet模型笔记
谁创造了AlexNet? AlexNet是有Hinton大神的弟子Alex Krizhevsky提出的深度卷积神经网络.它可视为LeNet的更深更宽的版本. AlexNet主要用到的技术 成功使用Re ...
- Memcached在Linux环境下的使用详解
一.引言 写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完了,从安装到数据类型,在到集群,几乎都写到了.如果以后有了心得,再补充吧.然后就 ...
- js判断奇偶数实现隐藏显示功能 与css立体按钮
hello! 好久不见了 ,今天也没准备什么技术,知识想和大家就见个面,一个js判断奇数偶数来实现css样式 ,感觉最大的用途就是页面的导航.就这么一个小小的技术. 劳动快乐 当!当!当! ...
- Go 语言数据类型
在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...
- win 10 和 CentOS 7 双系统安装
工具及材料 1.一台PC 2.一个U盘,8G以上 3.需要的文件:CentOS-7-x86_64-DVD-1511.iso 4.需要的软件:UltraI ...
- 《读书报告 -- Elasticsearch入门 》--简单使用(2)
<读书报告 – Elasticsearch入门 > ' 第四章 分布式文件存储 这章的主要内容是理解数据如何在分布式系统中存储. 4.1 路由文档到分片 创建一个新文档时,它是如何确定应该 ...
- GitHub Android Librarys Top 100 简介
GitHub Android Librarys Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索J ...
- Spark Streaming + Kafka整合(Kafka broker版本0.8.2.1+)
这篇博客是基于Spark Streaming整合Kafka-0.8.2.1官方文档. 本文主要讲解了Spark Streaming如何从Kafka接收数据.Spark Streaming从Kafka接 ...