统计资料linregress倾斜并拦截错误

问题描述

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

xx = np.load('./x.npy')
yy = np.load('./y.npy')

fig,ax = plt.subplots()
fig = plt.gcf()
fig.set_size_inches(16,8)
labels = ['C1','C2']
colors = ['r','b']

for idx in range(2):

    df = pd.DataFrame({'x': xx,'y': yy[idx]})
   
    ax.set(xlim=(np.min(df.x),np.max(df.x)),ylim=(np.min(df.y),np.max(df.y)))

    p = sns.regplot('x','y',df,scatter=False,order=2,ax=ax,label=labels[idx],color=colors[idx])

    slope,intercept,r_value,p_value,std_err = stats.linregress(
        x=p.get_lines()[0].get_xdata(),y=p.get_lines()[0].get_ydata())
       
    formula = str(slope)     + ' x\N{SUPERSCRIPT TWO} '     + str(intercept)

    print('formula: ',formula)

我正在尝试计算sns.regplot拟合线的斜率和截距,它会给我:

formula:  82.53958162912909 x² 130.19916935648575
formula:  82.53958162912909 x² 130.19916935648575

其中:

  1. 从图中可以看出,这是错误的,对于x值为6,我们期望y值为600。

  2. 两条线的斜率和截距相同。我们希望会有所不同。

plot

您可以找到x,y个文件here

解决方法

即使您已经在Line2Dxx中拥有数据,我也不知道为什么要从yy对象中获取数据,但是无论如何:

在循环中计算回归时,每次迭代都传递相同的数据集(第[0]行)。我想你是要写

slope,intercept,r_value,p_value,std_err = stats.linregress(
            x=xx,y=yy[idx])