机器学习之多项式拟合
机器学习之多项式拟合
- 实验内容
- 目标
- 要求
- 实验步骤
- 生成随机数据
- 高阶多项式拟合
- 无正则项的解析解
- 有正则项的解析解
- 梯度下降法
- 共轭梯度法
实验内容
目标
掌握最小二乘法求解(无惩罚项的损失函数)、掌握加惩罚项(2范数)的损失函数优化、梯度下降法、共轭梯度法、理解过拟合、克服过拟合的方法(如加惩罚项、增加样本)
要求
- 生成数据,加入噪声;
- 用高阶多项式函数拟合曲线;
- 用解析解求解两种loss的最优解(无正则项和有正则项)
- 优化方法求解最优解(梯度下降,共轭梯度);
- 用你得到的实验数据,解释过拟合。
- 用不同数据量,不同超参数,不同的多项式阶数,比较实验效果。
- 语言不限,可以用matlab,python。求解解析解时可以利用现成的矩阵求逆。梯度下降,共轭梯度要求自己求梯度,迭代优化自己写。不许用现成的平台,例如pytorch,tensorflow的自动微分工具。
实验步骤
生成随机数据
sin(2πx) 加入高斯噪声
def generateData(x1, x2, noise, n):mu, sigma = 0, 0.1while True:s = np.random.normal(mu, sigma, n)if (abs(mu-np.mean(s)) < 0.01) & (abs(sigma - np.std(s, ddof=1)) < noise):breakx = np.linspace(x1, x2, n)y = np.sin(2.0*math.pi*x) + s * noisereturn x, y
高阶多项式拟合
从0阶到10阶,调用polyfit函数进行拟合并绘图
trainSet = generateData(0.1, 0.9, 0.5, 10)
for degree in range(10):coff = polyfit(trainSet[0], trainSet[1], degree)my_plot = np.polyval(coff, x_plot)plt.plot(trainSet[0], trainSet[1], color='g', linestyle='', marker='o', label=u"generate data with noise")plt.plot(x_plot, my_plot, linestyle='-', marker='', label="degree: " + str(degree))plt.legend(loc='upper left')plt.show()
无正则项的解析解
推导过程网上有很多,比如这个.
首先构造矩阵,因为系数从高阶到低阶,所以矩阵要从左到右的降阶数构造,然后直接套公式即可。
X0 = np.zeros((10, 10))
for k0 in range(10):for n0 in range(10):n0 = 9 - n0if (n0 == 9):X0[k0][n0] = 1else:X0[k0][n0] = X0[k0][n0 + 1] * trainSet[0][k0]a1 = X0
a2 = np.transpose(a1)
Ans = np.dot(np.dot(np.linalg.inv(np.dot(a2, a1)), a2), np.transpose(trainSet[1]))
有正则项的解析解
直接加入正则项即可。e-18 效果最好,可调整参数看效果
lam = np.exp(-18)
Ans = np.dot(np.dot(np.linalg.inv(np.dot(a2, a1) + lam * np.eye(10)), a2), np.transpose(trainSet[1]))
梯度下降法
关于原理,参见这里,或者这里.
当然有能力最好维基百科,全面清晰。
网上很多包括csdn上都有很多代码分享,但确实很多都有问题,老师也不推荐csdn上。之前搜索学习的时候参考的几份代码也都是有问题的,搞学术这种东西还是不能马虎,自己系统学习比照葫芦画瓢不明所以还是要好很多的。
def loss_function(theta, X):P = np.mat(trainSet[1])diff = np.dot(X, theta) - np.transpose(P)return 0.5 / 10 * np.dot(np.transpose(diff), diff) + lam * np.dot(np.transpose(theta), theta)def gradient_function(theta):P = np.mat(trainSet[1])diff = np.dot(X, theta) - np.transpose(P)return 1.0 / 10 * np.dot(np.transpose(X), diff) + lam * thetadef gradient_descent(lr):theta = np.ones((10, 1))gradient = gradient_function(theta)while not np.all(np.absolute(gradient) <= 1e-5):theta = theta - lr * gradientgradient = gradient_function(theta)return thetaX = np.zeros((10, 10))
for k0 in range(10):for n0 in range(10):if (n0 == 0):X[k0][n0] = 1else:X[k0][n0] = X[k0][n0 - 1] * trainSet[0][k0]lr = 0.01
optimal = gradient_descent(lr)
print('optimal:', optimal)
print('error function:', loss_function(optimal, X)[0, 0])
共轭梯度法
强推维基百科的条目。
原理基本就是线性代数那一套,推导还有示例还是很容易明白的。
代码基本初始化之后套进去就ok。
while True:alphak = np.dot(np.transpose(r[k]), r[k]) / np.dot(np.dot(np.transpose(p[k]), A), p[k])x[k + 1] = x[k] + alphak * p[k]r[k + 1] = r[k] - alphak * np.dot(A, p[k])if (np.all(np.absolute(r[k + 1]) < 1e-5)):breakbeita = np.dot(np.transpose(r[k + 1]), r[k + 1]) / np.dot(np.transpose(r[k]), r[k])p[k + 1] = r[k + 1] + beita * p[k]k = k + 1
然后就是对比两种梯度法的优劣了,网上有很多。
机器学习之多项式拟合相关推荐
- java 多项式拟合最多的项数_机器学习(1)--线性回归和多项式拟合
机器学习(1)--线性回归和多项式拟合 机器学习(2)逻辑回归 (数学推导及代码实现) 机器学习(3)softmax实现Fashion-MNIST分类 一 线性回归 线性回归,顾名思义是利用线性模型对 ...
- 机器学习实验一-多项式拟合
一.实验目的 掌握最小二乘法求解(无惩罚项的损失函数).掌握加惩罚项(2范数)的损失函数优化.梯度下降法.共轭梯度法.理解过拟合.克服过拟合的方法(如加惩罚项.增加样本) 实验要求及实验环境 实验要求 ...
- 机器学习——多项式拟合
文章目录 一.多项式拟合 1.1 多项式函数拟合 1.2 过拟合与正则化 1.3 维数灾难 二.基于概率的曲线拟合 2.1 高斯分布 2.2 重新理解曲线拟合 最大似然 最大化后验概率(maximum ...
- 数值计算之 拟合法,线性拟合,多项式拟合
数值计算之 拟合法之线性拟合,多项式拟合 前言 最小二乘法 多项式拟合 线性拟合 后记 前言 拟合法是另一种由采样数据求取潜在函数的方法.插值要求函数必须经过每一个采样节点,而拟合则要求函数与全部节点 ...
- python做多项式拟合并绘图
本文所用文件的百度云链接: 链接:https://pan.baidu.com/s/15-qbrbtRs4frup24Y1i5og 提取码:pm2c 之前有说过线性拟合了,显而易见,线性拟合在实际应 ...
- 【机器学习】欠拟合 过拟合 正则化
正则化 拟合效果 拟合效果分析 欠拟合原因 特征量过少 参数太少,模型复杂度过低 过拟合原因 建模样本选取有误 样本噪音干扰过大 假设不成立 参数太多,模型复杂度过高 其他 tree-based模型 ...
- 趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合
多项式拟合(最小二乘法) a基本原理: b拟合函数原理: c方法优缺点: 优点: 思想简单,实现容易.建模迅速,对于小数据量.简单的关系很有效. 解决回归问题,拥有很好的解释性. 是很多非线性模型的基 ...
- python多项式拟合_最小二乘法—多项式拟合非线性函数
本章涉及到的知识点清单: 1.函数的近似表示-高次多项式 2.误差函数-最小二乘法 3.引出案例函数曲线 4.目标函数 5.优化目标函数 6.优化目标函数-梯度下降法 7.优化目标函数-求解线性方程组 ...
- 机器学习:过拟合与欠拟合问题
本文首发于 AI柠檬博客,原文链接:机器学习:过拟合与欠拟合问题 | AI柠檬 过拟合(overfitting)与欠拟合(underfitting)是统计学中的一组现象.过拟合是在统计模型中,由于使用 ...
- python多项式拟合问题
某次项目中遇到,需要预测某个值.数据大概是这样的: 有4个特征,特征之间数据差异较大,根据四个特征预测需要预测一个值,数据量是24条.其实就是一个多项式的拟合问题.刚开始,我想着用一些简单的模型去拟合 ...
最新文章
- 一文读懂:深扒人脸识别60年技术发展史
- 软件测试第二次作业:JUNIT单元测试方法
- 秒杀多线程第十一篇 读者写者问题
- 十年后,你在元宇宙中的一天是什么样?
- golang 日志分析_Saferwall:下一代开源恶意软件分析平台
- xcode 不值钱的动画UIButton
- 计算机辅助建筑制图规范,房屋建筑制图统一标准 [附条文说明] GB/T50001-2017
- java8: hashmap性能提升
- 2015最新Linkedin人才趋势报告
- OpenCV入门教程,超详细OpenCV入门教程!10小时让你轻松掌握opencv的使用
- 淘宝装修:1920全屏海报(源代码免费下载)
- 网页版bpc电波对时_BPC电波对时app
- android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
- win 11 博通网卡解决蓝牙驱动问题 黑苹果在win11系统中
- 皮皮虾如何引流?皮皮虾运营如何变现?皮皮虾APP怎么引流?
- 通过NFS(nfsroot)启动linux系统
- 爆笑课堂:程序员看得懂的搞笑段子
- STEP找不到CPU
- Comet OJ - Contest #6 双倍快乐
- java文章管理系统源码_融成Java后台网站内容管理系统 v3.2.1