matplotlib - 线性回归图解释
问题描述
我有一个显示某些数据频率的直方图。我有两种类型的文件:Pdbs 和 Uniprots。每个 Uniprot 文件都与一定数量的 Pdb 相关联。所以这个直方图显示有多少 Uniprot 文件与 0 个 Pdb 文件、1 个 Pdb 文件、2 个 Pdb 文件……80 个 Pdb 文件相关联。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 轴上变为负数?这是正常的吗?
解决方案
解释这个线性回归的正确方法是“这个线性回归 90% 是没有意义的”。事实上,这 90% 中的一些比没有意义更糟糕,这是彻头彻尾的误导,正如您在负值中所指出的那样y
。OTOH,我们可以解释其中大约 10% 的内容,但您必须知道您在寻找什么。
为什么: 在其他通常不太明显的事情中,线性回归模型的假设之一是数据或多或少是线性的。如果您的数据不是线性的,并且添加了一些非常规则的“噪音”,那么所有的赌注都没有了。您的数据不是线性的。他们甚至不接近。所以所有的赌注都没有了。
由于所有的赌注都没有了,因此检查我们可能想要用线性回归模型做的事情是有帮助的。最难的是外推y
法,它是在原始x
范围之外进行预测。您的模型在外推方面的能力很好地说明了它在端点处的行为。这是您注意到“嘿,我的图表都是负数!”的地方。从非常简单的意义上讲,这是因为您采用了一个线性模型,将其拟合到不满足“线性”假设的数据,然后尝试使其做模型最难做的事情。模型要做的第二件最难的事情是插值,它在原始模型中进行预测x
范围。这种线性回归也不是很擅长。再往下看,如果我们只看线性回归线的斜率,我们可以大致了解我们的数据是增加还是减少。请注意,如果您的数据不是线性的,即使这个赌注也会被取消。但是,对于大型甚至非线性的现实世界数据,它通常以一种并非完全无用的方式工作。所以,这一件事,你的线性回归模型有点正确。你的数据在减少,线性模型也在减少。这就是我之前提到的 10%。
怎么做:尝试拟合更好的模型。您说您对原始数据进行了日志转换,但看起来并没有太大帮助。一般来说,“转换”数据的全部意义在于使其看起来是线性的。对数变换对指数数据很有帮助。如果您的起始数据看起来不像指数,那么对数转换可能无济于事。由于您正在尝试进行密度估计,因此您几乎肯定希望将概率分布拟合到这些东西上,甚至不需要进行转换以使数据线性化。 这是另一个 Stack Overflow 答案,其中详细介绍了如何将 beta 分布拟合到数据中。但是,有很多选择。
推荐阅读
- reactjs - 安装反应组件时第一次没有调用socket.on函数
- php - 计数以“custom_”开头的 $_POST 回复
- php - 如何将多维数组添加到 laravel 数据库
- android - android studio的MainActivity未解决的类错误
- javascript - Javascript在对象数组中查找具有匹配属性的对象,如果存在则获取另一个属性
- typo3 - 从调度程序任务中的存储库中删除所有()
- android - 如何创建具有透明背景和阴影的形状,但在形状轮廓后面不应该看到阴影?
- python - 使用线程模块对不同域的并行 GET 请求
- django - 如何使用 Django 将我的主页重定向到我的主域?
- spring-boot - 难以设置连接面项目以提供第一页