【问题标题】:Large Dataset Polynomial Fitting Using Numpy使用 Numpy 进行大型数据集多项式拟合
【发布时间】:2019-04-17 15:26:17
【问题描述】:

我正在尝试将二阶多项式拟合到原始数据并使用 Matplotlib 输出结果。我试图拟合的数据集中大约有一百万个点。它应该很简单,网上有很多例子。但是由于某种原因,我无法正确处理。

我收到以下警告消息:

RankWarning:Polyfit 可能条件不佳

这是我的输出:

这是使用 Excel 输出的:

请参阅下面的代码。我错过了什么??

xData = df['X']
yData = df['Y']
xTitle = 'X'
yTitle = 'Y'
title = ''
minX = 100
maxX = 300
minY = 500
maxY = 2200

title_font = {'fontname':'Arial', 'size':'30', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'18'}

#Poly fit

# calculate polynomial
z = np.polyfit(xData, yData, 2)
f = np.poly1d(z)
print(f)

# calculate new x's and y's
x_new = xData
y_new = f(x_new)   

#Plot
plt.scatter(xData, yData,c='#002776',edgecolors='none')
plt.plot(x_new,y_new,c='#C60C30')

plt.ylim([minY,maxY])
plt.xlim([minX,maxX])

plt.xlabel(xTitle,**axis_font)
plt.ylabel(yTitle,**axis_font)
plt.title(title,**title_font)

plt.show()      

【问题讨论】:

  • 如果删除异常值会发生什么?也许excel会自动删除异常值?

标签: python pandas matplotlib


【解决方案1】:

要绘制的数组必须是排序的。这是绘制排序数组和未排序数组之间的比较。未排序情况下的图看起来完全扭曲,但是,拟合函数当然是相同的。

        2
-3.496 x + 2.18 x + 17.26

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(0)

x = (np.random.normal(size=300)+1)
fo = lambda x: -3*x**2+ 1.*x +20. 
f = lambda x: fo(x) + (np.random.normal(size=len(x))-0.5)*4
y = f(x)

fig, (ax, ax2) = plt.subplots(1,2, figsize=(6,3))
ax.scatter(x,y)
ax2.scatter(x,y)

def fit(ax, x,y, sort=True):
    z = np.polyfit(x, y, 2)
    fit = np.poly1d(z)
    print(fit)
    ax.set_title("unsorted")
    if sort:
        x = np.sort(x)
        ax.set_title("sorted")
    ax.plot(x, fo(x), label="original func", color="k", alpha=0.6)
    ax.plot(x, fit(x), label="fit func", color="C3", alpha=1, lw=2.5  )  
    ax.legend()


fit(ax, x,y, sort=False)

fit(ax2, x,y, sort=True) 


plt.show()

【讨论】:

  • 您不是在比较已排序和未排序的拟合。您正在将您以随机顺序绘制的线与您没有绘制的线进行比较。试试print(np.polyfit(x, y, 2), np.polyfit(x2, y2, 2))
  • 天哪,我永远不会猜到!谢谢解释
  • @DSM 是的,这可能具有误导性。我编辑了答案。
  • 排序后我的情节仍然不对。和原来一样。我收到一条错误消息,提示“Polyfit 可能条件不佳”
  • 我不得不使用 float64 而不是 float32 - 不知道为什么这会是个问题?
【解决方案2】:

问题可能是对沿 x 轴从零偏移一段距离的数据使用幂基础。如果您使用来自numpy.polynomialPolynomial 类,它将在拟合之前缩放和移动数据,这将有所帮助,并且还会跟踪使用的比例和移位。请注意,如果您想要标准形式的系数,则需要转换为该形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2011-10-14
    • 2018-03-16
    相关资源
    最近更新 更多