使用curve_fit获取r平方值

时间:2013-10-04 19:34:10

标签: python matplotlib scipy

我是Python及其所有库的初学者。但我设法制作了一个按预期工作的小程序。 它需要一个字符串,计算不同字母的出现次数并在图形中绘制它们然后应用方程式及其曲线。 现在我想获得拟合的r平方值。

总的想法是比较不同层次的文章中不同类型的文本,看看整体模式有多强。

只是一个例外,我是新人,所以一个容易理解的答案会很棒。

代码是:

import numpy as np
import math
import matplotlib.pyplot as plt
from matplotlib.pylab import figure, show
from scipy.optimize import curve_fit

s="""det, og deres undersøgelse af hvor meget det bliver brugt viser, at der kun er seks plugins, som benyttes af mere end 5 % af Chrome-brugere.
Problemet med teknologien er, at den ivivuilv rduyd iytf ouyf ouy yg oyuf yd iyt erzypu zhrpyh dfgopaehr poargi ah pargoh ertao gehorg aeophgrpaoghraprbpaenbtibaeriber en af hovedårsagerne til sikkerhedshuller, ustabilitet og deciderede nedbrud af browseren.
Der vil ikke bve lukket for API'et  ivivuilv rduyd iytf ouyf ouy yg oyuf yd iyt erzypu zhrpyh dfgopaehr poargi ah pargoh ertao gehorg aeophgrpaoghraprbpaenbtibaeriber en af hovedårsagerne til sikkerhedshuller, ustabilitet og deciderede nedbrud af browseren.
Der vil ikke blive lukket for API'et på én gang, men det vil blive udfaset i løbet af et års tid. De mest populære plugins får lov at fungere i udfasningsperioden; Det drejer sig om: Silverlight (anvendt af 15 % af Chrome-brugere sidste måned), Unity (9,1 %), Google Earth (9,1 %), Java (8,9%), Google Talk (8,7 %) og Facebook Video (6,0 %).
Det er muligt at hvidliste andre plugins, men i slutningen af 2014 forventer udviklerne helt at lukke for brugen af dem."""
fordel=[]
alf=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','æ','ø','å']
i=1
p=0
fig = figure()
ax1 = fig.add_subplot(1,2,0)
for i in range(len(alf)):
    fordel.append(s.count(alf[i]))
    i=i+1   
fordel=sorted(fordel,key=int,reverse=True)
yFit=fordel
xFit=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]
def func(x, a, b):
    return a * (b ** x)
popt, pcov = curve_fit(func, xFit, yFit)
t = np.arange(0.0, 30.0, 0.1)
a=popt[0]
b=popt[1]
s = (a*b**t)
ax1.plot(t,s)
print(popt)
yMax=math.ceil(fordel[0]+5)
ax1.axis([0,30,0,yMax])
for i in range(0,int(len(alf))*2,2):
    fordel.insert(i,p)
    p=p+1
for i in range(0,int(len(fordel)/2)):
    ax1.scatter(fordel[0],fordel[1])
    fordel.pop(0)
    fordel.pop(0)
plt.show()
show()

2 个答案:

答案 0 :(得分:41)

计算r_squared

可以使用 mean r_squared)找到mean值,总平方和ss_tot) ,以及残差平方和ss_res)。每个定义为:

mean

SStot

SSres

rsquared

其中f_i是点x_i处的函数值。取自Wikipedia

来自scipy.optimize.curve_fit()

  • 您可以使用

    popt获取参数(curve_fit()

    popt, pcov = curve_fit(f, xdata, ydata)

  • 您可以使用

    获取残差平方和ss_tot
    • residuals = ydata- f(xdata, popt)
    • ss_res = numpy.sum(residuals**2)
  • 您可以使用

    获取总平方和ss_tot

    ss_tot = numpy.sum((ydata-numpy.mean(ydata))**2)

  • 最后,r_squared - 值为,

    r_squared = 1 - (ss_res / ss_tot)

答案 1 :(得分:0)

我认为这种方法是解决最小化问题的一种更简单的方法:

res = minimize(func)  # your optimize function
cof = np.reshape(np.array(res.x),(-1,1))
r_square = 1.0 - (np.var(ydata-xdata.dot(cof)) / np.var(ydata))

# or 
# r_square = 1 - np.square(ydata-xdata.dot(cof)).sum() / (np.var(ydata) * len(ydata))