python - SciPy 插值给出了意想不到的曲线
问题描述
对于数据集
x y
1 80
4 40
16 20
64 10
256 5
LibreOffice Calc 给我以下(多项式,3 次,趋势线)
但scipy.interpolate.interp1d
调用kind='cubic'
产生这个:
我试过玩interp1d
's 的论点,也试过样条插值,scipy.optimize.curve_fit
但都没有给我类似于 Calc 产生的东西。
解决方案
因此,您在 LibreOffice Calc 中所做的是将 x 转换为对数刻度,然后将数据拟合为三次多项式。对数刻度很重要;拟合 x 和 y 直接导致错误的曲线。这是 Python 的等价物:
import numpy as np
import matplotlib.pyplot as plt
x = [1, 4, 16, 64, 256]
y = [80, 40, 20, 10, 5]
logx = np.log2(x)
plt.scatter(logx, y, marker='s')
plt.xticks(logx, x)
plt.grid()
coeff = np.polyfit(logx, y, 3)
yfit = np.poly1d(coeff)
logx_new = np.linspace(logx[0], logx[-1], 100)
plt.plot(logx_new, yfit(logx_new))
interp1d
进行样条插值,在三次样条的情况下,每 3 个相邻点拟合三次多项式。无论您是否转换 x,这都不同于将所有数据拟合为三次多项式。
推荐阅读
- vagrant - 执行 `VBoxManage` 时出错(VBoxManage:错误:详细信息:代码 NS_ERROR_FAILURE (0x80004005),组件)
- php - 使用简单的php文件获取api响应但在codeigniter循环中没有得到响应
- r - 找不到对象 R 闪亮
- amazon-web-services - Amazon Polly 安排任务而不是完成它
- ios - IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url
- javascript - 在开发期间从列表共享点托管应用程序获取重复数据
- c++ - 在编程时了解何时使用堆栈内存以及何时使用堆内存?
- node.js - NVM - 无法安装 expo 依赖项
- html - 角 8 | 使用指令隐藏元素
- hyperledger-fabric - 获取错误为:错误:需要 Client.createUser 参数“opts mspid”