如何在 python 线性回归图上强制截距?

How do I force intercept on a python linear regression plot?

如何在此数据帧上强制直线和方程通过 0?我只知道如何制作一条最适合的线,match.Below 的等式是最适合线的代码,没有通过 0 的强制截距。任何获得强制截距的帮助都将受到赞赏!

import seaborn as sns
import scipy as sp
r, p = sp.stats.pearsonr(x=df['mass(mg)'], y=df['Abs'])
sns.regplot(x=df['mass(mg)'],y=df['Abs']).set(Title='biuret standard plot')

def equation(x,y):
    x_mean = x.mean()
    y_mean = y.mean()
    
    B1_num = ((x - x_mean) * (y - y_mean)).sum()
    B1_den = ((x - x_mean)**2).sum()
    B1 = B1_num / B1_den
    B0 = y_mean - (B1*x_mean)
    
    reg_line = 'y = {} + {}β'.format(B0, round(B1, 3))
    
    return (B0, B1, reg_line)
equation(df['mass(mg)'],df['Abs'])

Seaborn 的线性回归不会让你这样做。

因此,如果您想让直线穿过原点,即 (0,0),那么您的等式是 y=mx。如果您这样做,则没有 B0。所以我们用 numpy.linalf.lstq 做最小二乘法,强制通过原点。我们还添加了 0 个坐标,以便它继续绘制。考虑你的质量和绝对值,见下文:

import numpy as np
import matplotlib.pyplot as plt

# I'm adding a 0 in both x and y axis to force a line drawn.
x = np.array([0, 5, 4, 3, 2, 1, 0.5])
y = np.array([0, 0.596, 0.464, 0.333, 0.201, 0.121, 0.062])

# We only need a*x. so to figure out a we use lstsq from numpy
# Our x matrix is one dimensional, it needs to be two dimensional to use lstsq so:
x = x[:,np.newaxis]
a, _, _, _ = np.linalg.lstsq(x, y)

plt.plot(x, y, 'bo')
plt.plot(x, a*x, 'r-')
plt.xlim([0, 6])
plt.ylim([0, 0.7])
plt.show()
print(f"y = {a} x + 0")

输出:

随意添加标签等

希望对您有所帮助,如果有帮助,请标记为答案!

sns.regplot 有一个参数 truncate=,默认为 True 并将行限制为给定数据。使用 truncate=False 线会延伸到边界。您可以在调用sns.regplot之前设置xlim到一个合适的范围。

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset('tips')
plt.xlim(-10, 80)
sns.regplot(data=tips, x='total_bill', y='tip', truncate=False, color='turquoise')
plt.axvline(0, color='gray', ls='--')
plt.show()

如果你想延长到x=0并且仍然限制数据限制的权利,你可以在regplot之前和之后设置xlim

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset('tips')
plt.xlim(0, tips['total_bill'].max())
sns.regplot(data=tips, x='total_bill', y='tip', truncate=False, color='coral')
plt.axvline(0, color='gray', ls='--')
plt.xlim(-5, tips['total_bill'].max() + 5)
plt.show()