2015-06-05 4 views
4

У меня есть участок со мной, который является логарифмическая на обеих осях. У меня есть функция loglog pyplot для этого. Он также дает мне логарифмическую шкалу на обеих осях.Подгонка прямой к кривой логарифмической войти Matplotlib

Теперь, используя NumPy я вписываюсь прямой линией к множеству точек, которые у меня есть. Однако, когда я рисую эту строку на сюжете, я не могу получить прямую линию. Я получаю изогнутую линию. The blue line is the supposedly "straight line". It is not getting plotted straight. I want to fit a straight line to the curve plotted by red dots

Синяя линия - это якобы «прямая линия». Это не получается прямолинейно. Я хочу, чтобы соответствовать этой прямой к кривой, построенной красными точками

Вот код, я использую для построения точек:

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

Разве это не просто то, что вы рисуете прямую линию по логарифмической шкале? –

+0

Ya, есть. Но как это сделать, используя matplotlib, чтобы он был полностью закрыт? –

ответ

6

Ваша линейная подгонка не выполняется на одних и тех же данных, как показано в лог-график.

Сделайте и б Numpy массивы как этот

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

Теперь вы можете выполнять операции над ними. То, что делает логлог-график, заключается в том, чтобы взять логарифм на базу 10 как a, так и b. Вы можете сделать то же самое на

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

Это то, что визуализирует логлог. Проверьте это, построив как 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) 
7

Чтобы лучше понять эту проблему, давайте сначала поговорим о простом ола»линейной регрессии (функция polyfit, в этом случае, ваш алгоритм регрессии линейной).


Предположим, у вас есть множество точек (х, у), как показано ниже:

Linear regression diagram

Вы хотите создать модель, которая предсказывает y как функцию x, так что вы используйте линейную регрессию. Это использует модель:

y = mx + b

и вычисляет значения m и b, которые наилучшим образом спрогнозировать ваши данные, используя некоторую линейную алгебру.

Затем вы используете свою модель для прогнозирования значений y как функции x. Вы делаете это, выбирая набор значений для x (think linspace) и вычисляя соответствующие значения y. Построение этих (x, y) пар дает вам линию регрессии.

Теперь давайте поговорим о логарифмической регрессии. В этом случае у нас все еще есть две переменные y по сравнению с x, и нас все еще интересует их связь, то есть возможность предсказать y, приведенную x. Единственное отличие состоит, теперь y и x случается логарифмы двух других переменных, которые я буду называть log(F) и log(R). До сих пор это не что иное, как простое изменение имени.

Log regression diagram

линейной регрессии также работает точно так же. Вы все еще регрессируете y против x. Алгоритм линейной регрессии не волнует, что y и x фактически являются 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).

 Смежные вопросы

  • Нет связанных вопросов^_^