【问题标题】:Getting the r-squared value using curve_fit使用curve_fit获取r平方值
【发布时间】:2013-10-11 22:22:34
【问题描述】:

我是 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()

【问题讨论】:

    标签: python matplotlib scipy


    【解决方案1】:

    计算:

    值可以使用 均值 ()、总平方和 () 和 残差平方和 ()。每个定义为:

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

    来自scipy.optimize.curve_fit()

    • 你可以从curve_fit()获取参数(popt

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

    • 您可以通过

      获得残差平方和 ()
      • residuals = ydata- f(xdata, *popt)
      • ss_res = numpy.sum(residuals**2)
    • 您可以通过

      获得平方和 ()

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

    • 最后,-value 与,

      r_squared = 1 - (ss_res / ss_tot)

    【讨论】:

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

    似乎有一些background 关于R2 没有直接在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)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 1970-01-01
        • 2014-06-24
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 2015-10-19
        • 1970-01-01
        相关资源
        最近更新 更多