繁体   English   中英

如何在 python 线性回归 plot 上强制拦截?

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

如何在这个 dataframe 上强制直线和方程通过 0? 我只知道如何制作一条最适合的线和匹配的方程式。下面是最适合的线的代码,没有通过 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) 获得到 go 的线,那么您的等式是 y=mx。 如果您这样做,则没有 B0。 所以我们使用 numpy.linalf.lstq 来做最小二乘并强制它通过原点。 我们还添加了 0 个坐标,以便它继续绘制。 考虑你的质量和 Abs 值,见下文:

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时,该行会一直延伸到边界。 您可以在调用xlim之前将sns.regplot设置为合适的范围。

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()

sns.regplot 延伸到边界

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

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()

sns.regplot 扩展到零

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM