5

両方の軸で対数的なプロットがあります。これを行うための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()
4

3 に答える 3

7

この問題をよりよく理解するために、まず単純な線形回帰について話しましょう (polyfitこの場合、関数は線形回帰アルゴリズムです)。


以下に示す一連のデータ ポイント (x、y) があるとします。

線形回帰図

yの関数として予測するモデルを作成するため、x線形回帰を使用します。それはモデルを使用します:

y = mx + b

そして、いくつかの線形代数を使用して、データを最もよく予測するmとの値を計算します。b

次に、モデルを使用して、y の値を x の関数として予測します。これを行うには、x の値のセット (linspace を考えてください) を選択し、対応する y の値を計算します。これらの (x,y) ペアをプロットすると、回帰直線が得られます。


さて、対数回帰について話しましょう。この場合、まだ 2 つの変数 y 対 x があり、それらの関係、つまり、y与えられた を予測できることに関心がありxます。唯一の違いは、他の 2 つの変数の対数であることです。これをyおよびと呼びます。これまでのところ、これは単純な名前の変更にすぎません。xlog(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。これは、 と の間のF関係Rです。これはべき法則の関係です。(べき乗関係は、対数対対数プロットが最も得意とするものです。)

コードでは、 を呼び出すときに A と B を使用してpolyfitいますが、 と を使用する必要がlog(A)ありlog(B)ます。

于 2015-06-05T17:29:56.567 に答える
5

loglog-plot に示されているのと同じデータに対して線形近似は実行されません。

このような a および b numpy 配列を作成します

a = numpy.asarray(a, dtype=float)
b = numpy.asarray(b, dtype=float)

これで、それらに対して操作を実行できます。loglog-plot が行うことは、a と b の両方の 10 を底とする対数を取ることです。あなたは同じことをすることができます

logA = numpy.log10(a)
logB = numpy.log10(b)

これは、loglog プロットが視覚化するものです。logA と logB の両方を通常のプロットとしてプロットして、これを確認してください。log データに対して線形近似を繰り返し、logA、logB データと同じプロットに線をプロットします。

coefficients = numpy.polyfit(logB, logA, 1)
polynomial = numpy.poly1d(coefficients)
ys = polynomial(b)
plt.plot(logB, logA)
plt.plot(b, ys)
于 2015-06-05T16:04:01.173 に答える