2019/3/25

真的,当那个图像出现的时候,我真的感觉太美了。

或许是一路上以来自我的摸索加深的我对于这个模型的感受吧。

二次函数拟合——最小二乘法公式法

与线性回归相似,对二次函数进行拟合某种意义上也只是加了一个函数,虽然求解的方程变得更加繁琐,需要准备的变量也增加到了七个。

思路有借鉴于:最小二乘法拟合二次曲线 C语言

为了更好的理解回归问题中最小二乘法的求偏导过程,这次我选择自己手打公式。

大概流程如下



但是到此处之后便被这三个繁琐的方程给难倒了,虽然肯定可以说是能强解,但是感觉就是不断地消元,还是在大量系数的情况下,于是我查找了资料,自然万能的python库是无所不能的,解三元一次方程这种小事当然轻松——sympy库

这个库简直是神器,我主要运用了一下几个功能

声明变量

b0=sp.Symbol('b0')
b1=sp.Symbol('b1')
b2=sp.Symbol('b2')

毕竟出现在方程中的未知数是未定义的,一般情况下是不能允许定义前的运算,可以说这是解方程的基础。

解方程

f1=((s1-b1*s2-b2*s3)/100)-b0
f2=((s4-b0*s2-b2*s5)/s3)-b1
f3=((s6-b0*s3-b1*s5)/s7)-b2
result=sp.solve([f1,f2,f3],[b0,b1,b2])



sp.solve([((s1-b1*s2-b2*s3)/100)-b0,((s4-b0*s2-b2*s5)/s3)-b1,((s6-b0*s3-b1*s5)/s7)-b2],[b0,b1,b2])

然而此处出现了一个巨大的坑,那就是,最终如果这样输出

print(sp.solve([f1,f2,f3],[b0,b1,b2]))

结果便是

{b0: 5.54334244651814, b1: 0.458746450400443, b2: 0.960930395945233}

一开始我没有意识到,直到运行时满屏幕红字报错,其中最主要的一句话

TypeError: can't convert expression to float

我当时就纳了闷了,print结果好好的,都是float,怎么还不行?

后来不断查阅网上相关博客,直到

使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式

真的是,一语点醒梦中人。

solve得出的解并不是完好的存在了之前“声明”的变量中,严格意义上来讲,是存储在了一个词典中。他的索引是那个变量名。也就是说,我们把变量名当成了字符形式,真正意义上只是个摆设,表示未知量却不存储最终结果,看到这里真是又兴奋有懊悔,或许是我对python的特殊数据类型不熟悉吧。也因此最终用了以下函数解决

a=result[b0]
b=result[b1]
c=result[b2]

plt.plot()函数也遇到了这个问题,不过也解决了。

至此呈上结果图



或许这就是完成一个小工程的喜悦吧。

完整代码如下(留有过去删改及笔记):

import xlrd
import xlwt
import sympy as sp
import matplotlib.pyplot as plt
import numpy as np
workbook=xlrd.open_workbook(r'6.xls') sheet=workbook.sheet_by_index(0)
cols1=sheet.col_values(0) #获取第一列
cols2=sheet.col_values(1) #获取第二列
n=100
s1=0
s2=0
s3=0
s4=0
s5=0
s6=0
s7=0
for i in range(n):
s1=s1+cols2[i]
s2=s2+cols1[i]
s3=s3+cols1[i]*cols1[i]
s4=s4+cols1[i]*cols2[i]
s5=s5+cols1[i]*cols1[i]*cols1[i]
s6=s6+cols1[i]*cols1[i]*cols2[i]
s7=s7+cols1[i]*cols1[i]*cols1[i]*cols1[i]
b0=sp.Symbol('b0')
b1=sp.Symbol('b1')
b2=sp.Symbol('b2')
f1=((s1-b1*s2-b2*s3)/100)-b0
f2=((s4-b0*s2-b2*s5)/s3)-b1
f3=((s6-b0*s3-b1*s5)/s7)-b2
result=sp.solve([f1,f2,f3],[b0,b1,b2]) #{b0: 5.54334244651814, b1: 0.458746450400443, b2: 0.960930395945233} #b0=sp.Symbol('b0')
#b1=sp.Symbol('b1')
#b2=sp.Symbol('b2')
#sp.solve([((s1-b1*s2-b2*s3)/100)-b0,((s4-b0*s2-b2*s5)/s3)-b1,((s6-b0*s3-b1*s5)/s7)-b2],[b0,b1,b2])
a=result[b0]
b=result[b1]
c=result[b2]
plt.scatter(cols1,cols2,color = 'blue')
x=np.linspace(0,15,100)
y=a+b*x+c*x*x
plt.plot(x,y,color="red")
plt.show()

Python实现——二次多项式回归(最小二乘法)的更多相关文章

  1. 机器学习二 逻辑回归作业、逻辑回归(Logistic Regression)

    机器学习二 逻辑回归作业   作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57 ...

  2. Python实现LR(逻辑回归)

    Python实现LR(逻辑回归) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end o ...

  3. Python 基础 二

    Python 基础 二 今天对昨天学习的Python基础知识进行总结,学而不思则惘,思而不学则殆! 一.先对昨天学习的三大循环的使用情况进行总结: 1.while循环的本质就是让计算机在满足某一条件的 ...

  4. 初学Python(二)——数组

    初学Python(二)——数组 初学Python,主要整理一些学习到的知识点,这次是数组. # -*- coding:utf-8 -*- list = [2.0,3.0,4.0] #计算list长度 ...

  5. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  6. 有关python下二维码识别用法及识别率对比分析

    最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...

  7. PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  8. 从Scratch到Python——Python生成二维码

    # Python利用pyqrcode模块生成二维码 import pyqrcode import sys number = pyqrcode.create('从Scratch到Python--Pyth ...

  9. 用python生成二维码

    Python生成二维码,可以使用qrcode模块, github地址 我是搬运工 首先安装, 因为打算生成好再展示出来,所以用到Pillow模块 pip install qrcode pip inst ...

随机推荐

  1. Python图片转字符画

    PIL安装很麻烦,推荐下载exe直接安装 PIL官网:http://pythonware.com/products/pil/ 但现在里面下载链接访问不了,我把32位和64位版本上传到博客园以供下载 P ...

  2. Java面向对象-递归

    Java面向对象-递归 递归,就是程序调用自身,我们讲的是方法递归调用,也就是在方法里自己调用自己: 我们给出一个案例,求阶乘  1*2*3*...*(n-1)*n 我们用非递归和递归方式分别实现下, ...

  3. Android使用图表库简单教程

    经常要用到统计数据这个功能,要直观的显示出来,最好还是用图表.自己弄也麻烦,所以用了Github上的一个非常著名的开源图标库:MpChart. 使用前去网上找它俩的jar包,然后导入就行.资源比较好找 ...

  4. HttpURLConnection连接网页和获取数据的使用实例

    HttpURLConnection是java.net 里面自带的一个类,非常好用.虽然现在很多人用阿帕奇的HttpClient,但HttpURLConnection也是个不错的选择. 其实使用方法非常 ...

  5. angularJS笔记之 服务

    angular的服务有五种 第一种 constant 一般作为一种常量的服务 不可更改 第二种 value 用来注册服务对象或函数 可更改 第三种 factory 创建和配置服务的最快捷方式.可更改 ...

  6. hive自带的字符串函数

    1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例: hive> select length('abcedfg') f ...

  7. ThinkPHP5如何引用新建的配置文件?

    1.在Application文件夹下建立extra 文件夹,并把新建的配置文件(例如字典配置文件dictConfig.php等)放入此文件夹: 2.在代码中使用 Config::get("d ...

  8. Android访问中央气象台的天气预报API得到天气数据

      最新说明:该接口已失效! 2014-03-04 可申请它公布的API,需申请:http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml 在用A ...

  9. Android适配器Adapter的学习

    Android中有很多的适配器,首先看看这些适配器的继承结构 这些适配器中,BaseAdapter用的最多,也用的最熟,先放过他,从ArrayAdapter开始 一个listAdapter用来管理一个 ...

  10. 408. Valid Word Abbreviation有效的单词缩写

    [抄题]: Given a non-empty string s and an abbreviation abbr, return whether the string matches with th ...