Monday, December 22, 2014

Python'da Doğrusal bir kestirim çizgisi çizmek

Problem: Elimizde bazı sayılar var ve bu sayılara doğrusal bir trend/kestirim çizgisi çekmek istiyoruz?

Çözüm:
Önce Kaynaklar:

Farklı çizimler için: http://stackoverflow.com/questions/8409095/matplotlib-set-markers-for-individual-points-on-a-line
Doğrusal kestirim / lineer regresyon için : http://stackoverflow.com/questions/10048571/python-finding-a-trend-in-a-set-of-numbers

Önce yukarıdaki ikinci kaynaktan bir regresyon kodu aldık, sonra bir çizgi hesaplattık. Dikkat edilmesi gereken nokta, x ekseni hep 1,2,3.... vs diye başlıyor. Bu da range(##) komutu ile sağlanıyor.
import matplotlib.pyplot as plt

def linreg(X, Y):
"""
return a,b in solution to y = ax + b such that root mean square distance between trend line and original points is minimized
"""
N = len(X)
Sx = Sy = Sxx = Syy = Sxy = 0.0
for x, y in zip(X, Y):
Sx = Sx + x
Sy = Sy + y
Sxx = Sxx + x*x
Syy = Syy + y*y
Sxy = Sxy + x*y
det = Sxx * N - Sx * Sx
return (Sxy * N - Sy * Sx)/det, (Sxx * Sy - Sx * Sxy)/det

x = [12, 34, 29, 38, 34, 51, 29, 34, 47, 34, 55, 94, 68, 81]
a,b = linreg(range(len(x)),x) #your x,y are switched from standard notation
print a,b
extrapolatedtrendline=[a*index + b for index in range(20)] #replace 20 with desired trend leng

#combine two arrays
total=x+extrapolatedtrendline
plt.plot(range(len(x)),x,'ro--')
plt.plot(range(len(extrapolatedtrendline)),extrapolatedtrendline)

plt.ylabel("sayılar")
plt.show()