基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归
回归方法就是寻找方差的最小值
y = kx + b
xi, yi
y-yi = kxi+b-yi
方差为
∑(kxi + b - yi )^2
f = k^2∑xi^2 + b^2 + ∑yi^2 +2kb∑xi - 2k∑xi*yi - 2yib
求极值需要对其求微分,因为是二元函数,因此使用全微分公式,其极值点应该在两个元的偏微分都为0处
δf/δk = 2k∑(xi^2)+2(∑xib-∑xi*yi) = 0
δf/δb = 2b +2(k∑xi -∑yi) = 0
b = ∑yi - k∑xi
2k∑(xi^2) + 2(∑xi∑yi - k(∑xi)^2-∑xi*yi)
k = (∑xi*yi - ∑xi∑yi)/(∑(xi^2)-(∑xi)^2)
以上就是最小二乘法的推导
那么扩展到二阶函数拟合回归
y = c0+c1*x+c2*x^2
xi, yi
y - yi = c0 + c1*xi + c2*xi^2 - yi
c0^2 + c1^2∑xi^2 + c2^2∑xi^4 +yi^2...
其三元偏微分表示如下
0 = c0 + c1∑xi + c2∑xi^2 - ∑yi
0 = c1∑xi^2 + c0∑xi + c2∑xi^3 - ∑xi*yi
0 = c2∑xi^4 + c0∑xi^2 + c1∑xi^3 - ∑xi^2 * yi
解方程可以求出三个参数
更高阶的回归可就不能手解方程了,需要用线性代数的知识
y = c0 + c1 * x + c2 * x^2 + c3 * x^3 0 = c0 + c1∑xi +c2∑xi^2 + c3∑xi^3 - ∑yi
0 = c0∑xi + c1∑xi^2 + c2∑xi^3 +c3∑xi^4 - ∑xi*yi
0 = c0∑xi^2 + c1∑xi^3 + c2∑xi^4 + c3∑xi^5 - ∑xi^2*yi
0 = c0∑xi^3 + c1∑xi^4 +c2∑xi^5 +c3∑xi^6 - ∑xi^3*yi M * [c0, c1, c2, c3]T = [∑yi, ∑xi*yi, ∑xi^2*yi, ∑xi^3*yi]T
[c0, c1, c2, c3]T = M^-1 * [∑yi, ∑xi*yi, ∑xi^2*yi, ∑xi^3*yi]T
实际上这个最终转为了求矩阵逆的过程 因此多阶函数的拟合回归本质是矩阵求逆,这对于应用数学工具而言是比较容易的 更普遍的,对于y = ∑cj*gj(x)的形式,有
Yj = ∑(i)(gj(xi) * yi)
Mj,k = ∑(i)(gj(xi) * gk(xi))
M * C = Y; C = M^(-1) * Y (M 为矩阵,C和Y为向量)
求解Ck可以得到线性参数集 数学最优美的地方就是可以化繁为简,而同样优美的是代码,使用python写出以上过程的算法验证
以下程序基于numpy和matplotlib,其实简单应用用python确实足以替代matlab了 为了防止高次计算溢出,对x, y进行归一,之前没做这步,算到四次回归就溢出了
x' = x/xmax
y' = y/ymax
y = ∑(Cj * gj(x / xmax))*ymax 对:
x = 1, 2, 4, 6, 7, 9, 12, 15, 18, 20
y = 1.5, 5, 14, 22, 25, 29, 32, 37, 41, 45
进行3阶函数回归计算,完整代码如下,为了强制符合PEP8规范,英文注释写的很蹩脚...
终于上代码了:
"""
name: regression
author: robocky
create time: 2017-1-1
description: Use polynomial function to fitting data
"""
import numpy as np
from numpy.linalg import inv
import matplotlib.pyplot as plt def polynomial(c: np.array, x: np.array, gs: list):
"""y = c0 * g0(x) + c1 * g1(x) + c2 * g2(x)...+ cn * gn(x)"""
return c.dot(np.array([g(x) for g in gs])) def regression(x: np.array, y: np.array, gs: list):
"""Use inv of matrix to calculate regression
y = ∑ci * gi(x)
"""
y_res = np.array([sum(g(x) * y) for g in gs])
x_matrix = np.array([[sum(g(x) * h(x)) for g in gs] for h in gs])
return inv(x_matrix).dot(y_res) def func_gen(n):
"""Generate power functions"""
return lambda x: x ** n def func_gen_sin(n):
"""Generate sin functions"""
return (lambda x: x ** 0) if n == 0 else lambda x: np.sin(n * x) if __name__ == '__main__':
# Test
x_list = np.array([1, 2, 4, 6, 7, 9, 12, 15, 18, 20])
y_list = np.array([1.5, 5, 14, 22, 25, 29, 32, 37, 41, 45])
g_list = [func_gen(i) for i in range(4)]
g_list2 = [func_gen_sin(i) for i in range(4)]
# Set numbers to unit, in order to avoid overflow
x_max, y_max = max(x_list), max(y_list)
c_list = regression(x_list / x_max, y_list / y_max, g_list)
c_list2 = regression(x_list / x_max, y_list / y_max, g_list2)
# plot
plt.figure()
plt.plot(x_list, y_list, 'bo')
x_line = np.arange(0, 1.02, 0.01)
plt.plot(x_line * x_max, polynomial(c_list, x_line, g_list) * y_max, color='red', label='x^n')
plt.plot(x_line * x_max, polynomial(c_list2, x_line, g_list2) * y_max, color='green', label='sin(x)')
plt.legend()
plt.show()
回归算法只有三行,当然计算过程都省略了,多项式也很简单
做了个函数生成器,理论上可以用任何函数进行回归运算,不过结果可能会发散,比如纯正弦函数,但加个常数项结果就收敛了
最后上个结果图

基于Python的函数回归算法验证的更多相关文章
- 微博传播数量和传播深度的预测--基于pyspark和某个回归算法
8-28决定参加一下这个千万条的数据处理任务,因为场景和自己做过的一个回归分析预测差不多,第一天开始在小规模的数据上做准备工作. 第二次大修改版本 date 20160829 星期一¶ 原始数据处理, ...
- 基于python的RSA解密算法
摘要 网上有很多关于RSA的解密脚本,欧拉函数.欧几里得函数什么的,对于一个大专生的我来说,一窍不通,至此经历了三天三夜,我翻阅了RSA的加密原理,以及其底层算法,专研出了一套我自己的解密算法,尚有不 ...
- 从0开始学正则表达式-基于python
关于正则表达式,当我们了解它就不难,不了解就很难,其实任何事情都是这样,没有人一生下来就啥都会,说白了,每个人都是一个学习了解进步的过程.学习和掌握正则表达式可能并不是太简单,因为它确实是有点像“外星 ...
- 基于python的七种经典排序算法
参考书目:<大话数据结构> 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. ...
- Python‘ssl.match_hostname()’函数SSL证书验证安全绕过漏洞
漏洞名称: Python‘ssl.match_hostname()’函数SSL证书验证安全绕过漏洞 CNNVD编号: CNNVD-201312-033 发布时间: 2013-12-04 更新时间: 2 ...
- 基于python的七种经典排序算法(转)
一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性:经过某种排序后,如果两个 ...
- 基于Python协同过滤算法的认识
Contents 1. 协同过滤的简介 2. 协同过滤的核心 3. 协同过滤的实现 4. 协同过滤的应用 1. 协同过滤的简介 关于协同过滤的一个最经典的例子就是看电影,有时候 ...
- 基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)
加入实验室后,经过张老师的介绍,有幸与某公司合共共同完成某个项目,在此项目中我主要负责的是三维 pdf 报告生成.Dicom图像上亮度.对比度调整以及 Dicom图像三维重建.今天主要介绍一下完成Di ...
- 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测
线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...
随机推荐
- LeetCode-Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- 不能从const char *转换为LPCWSTR
编译器有时候会根据编码方式来选择定义为LPCWSTR还是LPCTSTR LPSTR: 32bit指针 指向一个字符串,每个字符占1字节. 相当于 char * LPCSTR: 32-bit指针 指 ...
- CMD:在当前文件夹下打开cmd命令
对于电脑老鸟而言,在使用windows系统的过程中,经常需要在cmd窗口中输入一些命令进行操作.但是如果每一次都是在cmd窗口中用CD命令进行相应的文件夹目录,实在不便,尤其是在文件夹层次比较多而且带 ...
- 用crontab跑定时任务[转]
前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- InfoPi简介、试用链接、资料索引
InfoPi的定位是“个人信息收集服务器”. 用户可以灵活地定义信息的来源,比如从网页抓取感兴趣的信息.订阅博客.从温度传感器读取数据,等等. 然后,把收集到的信息用web的方式展示出来. 可以把In ...
- jq 获取元素的宽度时,如何取得小数部分
<!DOCTYPE html> <html> <head> <title></title> <meta name="arti ...
- js,addEventListener参数传递
解决方法 因为i相对匿名函数是外面的变量,就把循环绑定的时候,将i的值传入到匿名函数内,就可以了.因此需要在匿名函数(事件函数)外包裹一个匿名函数, 并立即执行. var elems = docume ...
- C指针详解(经典,非常详细)
前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优 ...
- Spark算上下基线
def baseLine(sc: SparkContext): Unit = { println("--------------------baseLine start----------- ...
- Mysql的视图、存储过程、函数、索引全解析
视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集合,并可以当作表来查询使用. 1创建视图 --格式:C ...