我正在尝试对例如i)人数,ii)拥有的汽车数量,例如前20%的人拥有超过所有汽车的20%-当然,100%的人拥有100%的汽车。我也知道例如1亿人和2亿辆汽车。
现在进入我的代码:
export const initialState = { ...
输入数据:Curveplot(左侧的累积人数(x)//右侧的累积车辆(y))
#import libraries (more than required here)
import pandas as pd
from scipy import interpolate
from scipy.interpolate import interp1d
from sympy import symbols, solve, Eq
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
%matplotlib inline
import plotly.express as px
from scipy import interpolate
curve=pd.read_excel('inputs.xlsx',sheet_name='inputdata')
但是,当查看实际绘图时,我得到以下错误结果:Cubic interpolation
实际上,曲线看起来应该几乎与线性插值中的曲线完全相同,但输入数据却完全相同-但这对我而言还不够准确:Linear interpolation
我有没有相关的步骤,或者从输入中获得近似线性插值的最佳插值方法是什么?
答案 0 :(得分:2)
简短的回答:您的代码在做正确的事,但是数据不适合三次插值。
让我解释一下。这是您为简化起见简化的代码
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt
cumulatedpeople = [0, 0.453086, 0.772334, 0.950475, 0.978981, 0.999876, 0.999990, 1]
cumulatedcars= [0, 0.016356, 0.126713, 0.410482, 0.554976, 0.950073, 0.984913, 1]
interpolation = interp1d(cumulatedpeople, cumulatedcars, kind = 'cubic')
number_of_people_mn= 100#000000
cumppl = np.arange(number_of_people_mn + 1)/number_of_people_mn
cumcars = interpolation(cumppl)
plt.plot(cumppl, cumcars)
plt.plot(cumulatedpeople, cumulatedcars,'o')
plt.show()
请注意最后两行-我正在同一张图上绘制插值结果和输入日期。这是结果
橙色点是原始数据,蓝色线是三次插值。插值器会遍历所有点,因此从技术上讲是正确的事情
很明显,它没有按照您的意愿做
发生这种奇怪行为的原因主要是在右端,您有几个非常靠近的x点-内插器会产生大量的摆动,试图拟合非常靠近的点。
如果我从插值器中删除了两个最右边的点:
interpolation = interp1d(cumulatedpeople[:-2], cumulatedcars[:-2], kind = 'cubic')
但是仍然有人认为线性插值更好。现在在左端摆动,因为初始x点之间的间隙太大
这里的道理是,只有在x点之间的间隙大致相同的情况下,才应真正使用三次插值
我认为,您最好在这里使用curve_fit
可以找到相关的讨论here
如here所述,特别是单调插值会对您的数据产生良好的结果。在此处复制相关位,您可以将内插器替换为
from scipy.interpolate import pchip
interpolation = pchip(cumulatedpeople, cumulatedcars)