Python 使用曲线拟合获得r平方值

Python 使用曲线拟合获得r平方值,python,matplotlib,scipy,Python,Matplotlib,Scipy,我是Python及其所有LIB的初学者。但我已经成功地制作了一个小程序,它可以按预期的方式工作。 它获取一个字符串,计算不同字母的出现次数,并将它们绘制在图形中,然后应用一个方程式及其曲线 现在我想得到拟合的r平方值 总体思路是比较不同层次文章中不同类型的文本,看看整体模式有多强大 这只是一个练习,我是新来的,所以一个简单易懂的答案会很棒 代码是: import numpy as np import math import matplotlib.pyplot as plt from matplo

我是Python及其所有LIB的初学者。但我已经成功地制作了一个小程序,它可以按预期的方式工作。 它获取一个字符串,计算不同字母的出现次数,并将它们绘制在图形中,然后应用一个方程式及其曲线 现在我想得到拟合的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()

计算:

可以使用平均值()、总平方和()和剩余平方和()找到该值。每种定义如下:

其中是点处的函数值。摘自

来自
scipy.optimize.curve\u fit()

  • 您可以使用从
    曲线拟合()
    获取参数(
    popt

    popt,pcov=曲线拟合(f,扩展数据,ydata)

  • 您可以使用

    • residuals=ydata-f(扩展数据,*popt)
    • ss_res=numpy.sum(残差**2)
  • 您可以使用

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

  • 最后一点是-值

    r_平方=1-(ss_res/ss_tot)


我认为这种方法更容易解决最小化问题:

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

OFC!回答得很好。出于某种原因,我没有考虑只是计算自己,虽然它似乎相当直接。谢谢。两个问题:1。残差方程中的popt不应该替换为*popt吗?2.为什么不使用pcov呢?这和回答“拿笔和铅笔,打开维基百科,自己编写代码”一样有用。对于
scipy
中的线性拟合,我们将其作为标准输出,对于任何解算器,这将以一个整洁的表格的形式输出,其中包含t-stats、p-values、log-likelihoods等。对于“曲线拟合”,最好的答案是:“自己编码”。。。。。