26

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

3 回答 3

82

计算r_squared

r_squared可以使用均值( 意思是)、总平方和( ss_tot) 和残差平方和( ) 找到该值ss_res。每个定义为:

意思是

斯托特

SSres

平方

其中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-value ,

    r_squared = 1 - (ss_res / ss_tot)

于 2016-06-18T17:33:13.580 回答
2

似乎有一些关于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)
于 2021-11-30T18:31:15.730 回答
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))
于 2018-06-08T01:12:21.410 回答