Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多项式拟合不';高度标绘_Python_Numpy_Matplotlib - Fatal编程技术网

Python 多项式拟合不';高度标绘

Python 多项式拟合不';高度标绘,python,numpy,matplotlib,Python,Numpy,Matplotlib,我现在正在研究回归,试图用3个不同的度数将多项式模型拟合到我的数据中,它只绘制最低度数。我不知道哪里出了问题。以下是我的代码和数据点: # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates import datetime as dt import time def main(): inputfile = "statistic

我现在正在研究回归,试图用3个不同的度数将多项式模型拟合到我的数据中,它只绘制最低度数。我不知道哪里出了问题。以下是我的代码和数据点:

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt
import time

def main():
    inputfile = "statistics.txt"
    X= np.loadtxt(inputfile, delimiter=",",dtype=np.str, usecols=[0])
    X= [dt.datetime.strptime(date, '%d.%m.%Y') for date in X]
    X = mdates.date2num(X)
    Y= np.loadtxt(inputfile, delimiter=",", usecols=[1])
    num_training = int(0.9*len(X))
    num_test = len(X) - num_training
    X_train, Y_train = X[:num_training], Y[:num_training]
    X_test, Y_test = X[num_training:], Y[num_training:]
    plt.scatter(X_train, Y_train, color="blue",s=10, marker='o')
    plt.title("Euro Swedish Krona Exchange rate")
    plt.xlabel("Time in months from April to June in 2017")
    plt.ylabel("Exhange rate")
    colors = ['teal', 'yellowgreen', 'gold']
    for count, degree in enumerate([2, 3, 4]):
        coeffs = np.polyfit(X_train, Y_train, degree)
        f = np.poly1d(coeffs)
        x_line = np.linspace(X[0], X[-1], 50)
        x_line_plot = mdates.num2date(x_line)
        y_line = f(x_line)
        plt.plot(x_line_plot, y_line, color=colors[count], linewidth=2, label="degree {}".format(degree))
        print(coeffs)
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b'))
    plt.gca().xaxis.set_major_locator(mdates.MonthLocator())    
    plt.grid()
    plt.legend(loc='upper left')
    plt.show()

if __name__ == '__main__':
    main()
-----statistics.txt-----


我认为这是和日期有关的,因为我的情节没有日期。我的代码中也可能有太多的内容。同样奇怪的是,通过改变度值,我有时会得到3条曲线,有时只有1条。

正如@DavidG在评论中指出的那样,这三条曲线非常接近,所以除非放大,否则它们看起来是一样的

这只是问题的一个征兆。您可能注意到在运行代码时打印的警告。这表明
polyfit
中出现了一个数值问题。您的
X
值相对较大且非常接近。显然,它们的大小足以导致polyfit出现问题。避免这种情况的一种方法是从
X
值中减去平均值,使其以0为中心。(也可以考虑用标准偏差来划分移位数据。这种组合的移位和缩放称为白化。在这种情况下,简单地移位数据就足够了。)< /P> 下面是fitting and plotting代码的修改版本,它实现了
X
值的移动(我也稍微调整了颜色和样式):

结果表明,阶数为3和阶数为4的曲线仍然很接近,但它们与阶数为2的曲线有很大不同:


除了解释错误外,您还可以向我们展示您的.txt文件。如果您放大图形,您将看到它确实绘制了这三个图形,但它们非常接近。谢谢您的精彩回答!我从这个问题中学到的是,我应该使用带有颜色的标记,并且有有用的预处理技术来避免错误!下面是一个后续问题:现在我了解了回归,有线性和多项式,还有正弦曲线等,这是一种将曲线拟合到数据的函数。虽然有时我不得不使用预印方法来修改我的数据(从这里学习)。如果我理解正确,numpy的多元拟合使用最小二乘法作为估计器。我可以使用numpy中的其他估计器(我知道在sklearn中我可以使用Ridge Bayasian等),因为numpy只是一个简单的软件。关于回归和曲线拟合,还有什么我应该知道的吗?这个问题太宽泛了,在评论中无法回答,我觉得没有资格回答任何人“应该知道”的问题:)这样的问题可能适合我,好吧,我会试着自己学习主题回归。我还有最后一个问题:我如何用一些因素来估计哪个程度最适合数据?如果有几个因素,我想知道如何利用这些因素实现曲线性能。(我知道存在所谓的过盈问题,Tikhonov/Ridge正在努力解决。)
11.04.2017,9.6059
12.04.2017,9.5741
13.04.2017,9.5976
14.04.2017,9.5892
17.04.2017,9.5763
18.04.2017,9.6101
19.04.2017,9.6107
20.04.2017,9.6309
21.04.2017,9.6611
24.04.2017,9.6266
25.04.2017,9.5858
26.04.2017,9.5551
27.04.2017,9.6070
28.04.2017,9.6474
01.05.2017,9.6438
02.05.2017,9.6220
03.05.2017,9.6326
04.05.2017,9.7007
05.05.2017,9.6669
08.05.2017,9.6616
09.05.2017,9.6649
10.05.2017,9.6974
11.05.2017,9.6489
12.05.2017,9.6480
15.05.2017,9.6903
16.05.2017,9.7402
17.05.2017,9.7432
18.05.2017,9.7797
19.05.2017,9.7800
22.05.2017,9.7683
23.05.2017,9.7363
24.05.2017,9.7255
25.05.2017,9.7378
26.05.2017,9.7233
29.05.2017,9.7138
30.05.2017,9.7580
31.05.2017,9.7684
01.06.2017,9.7402
02.06.2017,9.7256
05.06.2017,9.7388
06.06.2017,9.7707
07.06.2017,9.7833
08.06.2017,9.7685
09.06.2017,9.7579
12.06.2017,9.7980
13.06.2017,9.7460
14.06.2017,9.7634
15.06.2017,9.7540
16.06.2017,9.7510
19.06.2017,9.7475
20.06.2017,9.7789
21.06.2017,9.7676
22.06.2017,9.7581
23.06.2017,9.7629
26.06.2017,9.7537
27.06.2017,9.7647
28.06.2017,9.7213
29.06.2017,9.6806
30.06.2017,9.6309
03.07.2017,9.6479
04.07.2017,9.6740
05.07.2017,9.6332
06.07.2017,9.6457
07.07.2017,9.6084
10.07.2017,9.6101
11.07.2017,9.6299
colors = ['teal', 'darkgreen', 'black']
markers = ['-', ':', '--']
alphas = [1, 1, 0.25]
mu = X_train.mean()
for count, degree in enumerate([2, 3, 4]):
    coeffs = np.polyfit(X_train - mu, Y_train, degree)
    f = np.poly1d(coeffs)
    x_line = np.linspace(X[0], X[-1], 50) 
    x_line_plot = mdates.num2date(x_line)
    y_line = f(x_line - mu)
    plt.plot(x_line_plot, y_line, markers[count], color=colors[count],
             linewidth=1+2*(count==2), alpha=alphas[count],
             label="degree {}".format(degree))
    print(coeffs)