Python实现——二次多项式回归(最小二乘法)
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实现——二次多项式回归(最小二乘法)的更多相关文章
- 机器学习二 逻辑回归作业、逻辑回归(Logistic Regression)
机器学习二 逻辑回归作业 作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57 ...
- Python实现LR(逻辑回归)
Python实现LR(逻辑回归) 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end o ...
- Python 基础 二
Python 基础 二 今天对昨天学习的Python基础知识进行总结,学而不思则惘,思而不学则殆! 一.先对昨天学习的三大循环的使用情况进行总结: 1.while循环的本质就是让计算机在满足某一条件的 ...
- 初学Python(二)——数组
初学Python(二)——数组 初学Python,主要整理一些学习到的知识点,这次是数组. # -*- coding:utf-8 -*- list = [2.0,3.0,4.0] #计算list长度 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- 有关python下二维码识别用法及识别率对比分析
最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- 从Scratch到Python——Python生成二维码
# Python利用pyqrcode模块生成二维码 import pyqrcode import sys number = pyqrcode.create('从Scratch到Python--Pyth ...
- 用python生成二维码
Python生成二维码,可以使用qrcode模块, github地址 我是搬运工 首先安装, 因为打算生成好再展示出来,所以用到Pillow模块 pip install qrcode pip inst ...
随机推荐
- DRF之解析器组件及序列化组件
知识点复习回顾一:三元运算 三元运算能够简化我们的代码, 请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达 ...
- Hibernate4.3.5搭建Log4j日志环境
本文记录Hibernate4.3.5搭建Log4j日志环境的过程 1.搞清楚Hibernate4.3.5的日志环境依赖 方法:查看帮助文档 3.5. Logging Important Complet ...
- CentOS 调用.Net 的Web Service,提示连接超时解决方案
我是使用axis调用.NET 的Web Service ,在Window下跑没有问题,将项目部署到Linux下,发现Web Service 连接超时,百度了下,发现是因为Linux不能直接跑.Net, ...
- Python编程总结之常用三方模块
1.excel读写 利用python进行excel读写是经常遇到的事情,最常用的excel读写模块必属xlrd和xlwt,前者负责读,后者负责写,配合起来可实现读写. 举例1):使用xlrd读取exc ...
- POJ1161(并查集)
1.题目链接地址 http://poj.org/problem?id=1161 2.源代码 #include <iostream> using namespace std; ]; ]; i ...
- Spring整合Junit4进行单元测试
一. 添加依赖包(maven) <dependency> <groupId>junit</groupId> <artifactId>junit</ ...
- java Web 监听器Listener详解
简介 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext.HttpSession和 ServletRequest这三大域对象的创建 ...
- codeforces:Helga Hufflepuff's Cup
题目大意:有一个包含n个顶点的无向无环连通图G,图中每个顶点都允许有一个值type,type的范围是1~m.有一个特殊值k,若一个顶点被赋值为k,则所有与之相邻的顶点只能被赋小于k的值.最多有x个顶点 ...
- POJ 3169 C - Layout
题意 有n头奶牛从1到n编号,按照编号顺序站成一排,有可能有多头奶牛站在同一个坐标上.一些奶牛互相喜欢,所以他们的距离不能大于某个距离,一些奶牛互相讨厌,所以他们的距离不能小于某个距离,请计算如果可能 ...
- Oracle——单行函数
两种 SQL 函数 单行函数 字符函数 大小写控制函数 SELECT employee_id, last_name, department_id FROM employees WHERE last_n ...