在matplotlib中将直线拟合到对数 - 对数曲线

Roh*_*nde 4 python numpy matplotlib loglog

我和我有一个情节,两个轴都是对数的.我有pyplot的loglog功能来做到这一点.它还给出了两个轴上的对数刻度.

现在,使用numpy我直线到我拥有的点集.但是,当我在情节上绘制这条线时,我无法得到一条直线.我得到一条曲线. 蓝线是所谓的

蓝线是所谓的"直线".它没有直接绘制.我想将这条直线拟合到由红点绘制的曲线上

这是我用来绘制点数的代码:

import numpy
from matplotlib import pyplot as plt
import math
fp=open("word-rank.txt","r")
a=[]
b=[]

for line in fp:
    string=line.strip().split()
    a.append(float(string[0]))
    b.append(float(string[1]))

coefficients=numpy.polyfit(b,a,1)
polynomial=numpy.poly1d(coefficients)
ys=polynomial(b)
print polynomial
plt.loglog(b,a,'ro')
plt.plot(b,ys)
plt.xlabel("Log (Rank of frequency)")
plt.ylabel("Log (Frequency)")
plt.title("Frequency vs frequency rank for words")
plt.show()
Run Code Online (Sandbox Code Playgroud)

cha*_*id1 7

为了更好地理解这个问题,让我们首先谈谈普通的线性回归(polyfit在这种情况下,函数是你的线性回归算法).


假设您有一组数据点(x,y),如下所示:

线性回归图

您想要创建一个预测y为函数的模型x,因此您使用线性回归.那使用模型:

y = mx + b

并使用一些线性代数计算最佳预测数据的值mb最佳预测数据.

接下来,使用模型预测y的值作为x的函数.您可以通过为x(想想linspace)选择一组值并计算y的相应值来完成此操作.绘制这些(x,y)对可以得到回归线.


现在,我们来谈谈对数回归.在这种情况下,我们仍然有两个变量,y与x,我们仍然对它们的关系感兴趣,即能够预测y给定的x.唯一的区别是,现在yx正好是其他两个变量,我会打电话的对数log(F)log(R).到目前为止,这只不过是名称的简单更改.

日志回归图

线性回归也以相同的方式工作.你仍然在回归y和x.线性回归算法不关心yx实际上是log(F)log(R)-它使得该算法没有差别.

最后一步有点不同 - 这就是你在上面的情节中被绊倒的地方.你正在做的是计算

F = m R + b

但是这是不正确的,因为之间的关系F,并R不是线性的.(这就是你使用对数日志图的原因.)

相反,你应该计算

log(F) = m log(R) + b

如果你改变它(将10增加到双方的力量并重新排列),你得到

F = c R^m

哪里c = 10^b.这之间的关系FR:这是一个功法的关系.(幂律关系是对数 - 对数图最好的.)

在你的代码中,你在调用时使用A和B polyfit,但你应该使用log(A)log(B).


tru*_*ter 5

您的线性拟合不会在loglog-plot中显示的相同数据上执行.

制作像这样的a和b numpy数组

a = numpy.asarray(a, dtype=float)
b = numpy.asarray(b, dtype=float)
Run Code Online (Sandbox Code Playgroud)

现在您可以对它们执行操作.loglog-plot的作用是将对数取为a和b的10的基数.你也可以这样做

logA = numpy.log10(a)
logB = numpy.log10(b)
Run Code Online (Sandbox Code Playgroud)

这是loglog图可视化的内容.通过将logA和logB绘制为常规图来检查这一点.在日志数据上重复线性拟合,并在与logA,logB数据相同的图中绘制线.

coefficients = numpy.polyfit(logB, logA, 1)
polynomial = numpy.poly1d(coefficients)
ys = polynomial(b)
plt.plot(logB, logA)
plt.plot(b, ys)
Run Code Online (Sandbox Code Playgroud)