使用curve_fit获取r平方值

Mat*_*ias 13 python matplotlib scipy

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

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

只是一个exrsise和我是新的,所以一个易于理解的答案将是令人敬畏的.

代码是:

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()
Run Code Online (Sandbox Code Playgroud)

小智 45

计算 r_squared:

r_squared使用均值可以找到(意思),总平方和(ss_tot)和剩余的平方和(ss_res).每个定义为:

意思

SStot

SSres

rsquared

哪里 f_i 是点的函数值 X_I.取自维基百科.

来自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)

  • 这与回答“拿起钢笔和铅笔,打开维基百科并自己编写代码!”同样有用。对于“scipy”中的线性拟合,我们将其作为标准输出,对于任何求解器,此输出都以包含 t 统计、p 值、对数似然等的整齐表格的形式输出。突然间,对于“curve_fit”,最佳答案是:“自己编码”...... (3认同)
  • 欧菲!精彩的回答。出于某种原因,我没有考虑自己计算它,尽管它看起来很简单。谢谢。 (2认同)
  • 两个问题:1.残差方程中的popt不应替换为* popt吗?2.为什么不使用pcov? (2认同)

Jos*_*e R 9

似乎有一些关于R 2没有直接在scipy.

您可以使用sklearn.metrics.r2_score

从你的例子来看:

from sklearn.metrics import r2_score
popt, pcov = curve_fit(func, xFit, yFit)
y_pred = func(xFit, *popt)
r2_score(yFit, y_pred)
Run Code Online (Sandbox Code Playgroud)