我有一个显示某些数据频率的直方图。 我有两种类型的文件:Pdbs和Uniprots。每个Uniprot文件都与一定数量的Pdb相关联。因此,此直方图显示了与0个Pdb文件,1个Pdb文件,2个Pdb文件... 80个Pdb文件关联的Uniprot文件数。 Y轴为对数刻度。
我对同一数据集进行了回归,这就是结果。
这是我用于回归图的代码:
# Fitting Simple Linear Regression to the Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
x = np.array(x).reshape((-1, 1))
y = np.array(y)
regressor.fit(x, y)
# Predicting the Test set results
y = regressor.predict(x)
# Visualizing the Training set results
plt.scatter(x, y, color = 'red')
plt.plot(x, regressor.predict(x), color = 'blue')
plt.title('Uniprot vs Pdb')
plt.xlabel('Pdbs')
plt.ylabel('Uniprot')
plt.savefig('regression_test.png')
plt.show()
您能帮我解释回归图吗? 我可以理解,随着Pdb数量的增加,与它们关联的Uniprots将会减少。 但是,为什么它在y轴上变为负数?这正常吗?
答案 0 :(得分:1)
解释此线性回归的正确方法是“此线性回归90%无意义”。实际上,正如您所指出的y
值为负,这90%中的一些比无意义更糟,这是彻头彻尾的误导性。 OTOH,我们可以解释其中的10%达到良好效果,但是您必须知道要寻找的内容。
原因:在其他通常不太明显的事物中,线性回归模型的假设之一是数据或多或少是线性的。如果您的数据不是线性的,并且添加了一些非常常规的“噪声”,那么所有选择都将关闭。您的数据不是线性的。他们甚至都没有。所以所有的赌注都没了。
由于所有下注都不可行,因此检查一下线性回归模型可能需要做的事情会很有帮助。最难的事情是extrapolation,它预测y
在原始x
范围之外。模型在外推时的能力很好地说明了其在端点处的行为。在这里,您注意到“嘿,我的图全都是负数!”。从非常简单的意义上讲,这是因为您采用了线性模型,将其拟合到不满足“线性”假设的数据,然后试图使其对模型执行最困难的工作。模型要做的第二件事是interpolation,它使预测内部在原始x
范围内。这种线性回归也不是很擅长。如果仅查看线性回归线的斜率,就可以大致了解我们的数据在增加还是减少。请注意,如果您的数据不是线性的,则即使下注也是。但是,对于大类甚至是非线性的现实世界数据,它通常都以一种并非完全没有用的方式解决。因此,这一件事,您的线性回归模型很正确。您的数据在减少,线性模型也在减少。那是我之前所说的10%。
做什么::尝试拟合更好的模型。您说您已对原始数据进行了日志转换,但看起来并没有太大帮助。通常,“转换”数据的全部目的是使其看起来线性。日志转换有助于处理exponential数据。如果您的起始数据看起来不像指数,那么对数转换可能会无济于事。由于您尝试进行density estimation,因此几乎可以肯定要使这种分布适合概率分布,对此甚至不需要进行变换就可以使数据线性化。 Here是另一个Stack Overflow答案,其中包含有关如何使Beta分布适合数据的详细信息。但是,有很多选择。
答案 1 :(得分:0)
您能帮我解释回归图吗?
线性回归试图在x变量和目标y变量之间建立一条线,该线以最接近可能的方式模拟“真实”值(在此处也找到图片:https://en.wikipedia.org/wiki/Linear_regression):
这里的线是蓝线,原始点是黑线。目的是使所有黑点的误差(黑点到蓝线)最小化。
回归线是蓝线。这意味着您可以描述一个线性等式y = m * x + b的uniprot,其常数值为m = 0.1(示例),b = 0.2(示例)和x = Pdbs。
我可以理解,随着Pdb数量的增加,与它们关联的Uniprots将会减少。但是为什么它在y轴上变为负数?
这是正常现象,您可以绘制这条线直到-10000000 Pdbs或其他任何东西,这只是一个等式。不是真实的路线。
但是您的绘图中有一个错误,您是否还需要绘制原始的黑点?
y = regressor.predict(x)
plt.scatter(x, y, color = 'red')
这是错误的,您应该向其添加原始值,以从我的图形中获取绘图,例如:
y = df['Uniprot']
plt.scatter(x, y, color = 'red')
应该有助于理解它。