数据集(落石)由幂律y=aV^-b描述。
拟合结果与excel相当不一致,尤其是在极端值非常大的情况下。curve_fit似乎不能很好地处理最大值。我想知道curve_fit是否不是实现此目的的最佳工具?我是否应该使用某种回归来拟合幂律。感谢您的帮助,我希望问题已经很清楚了。主要问题:为什么它看起来拟合数据不太好?R2值很好,但是曲线拟合看起来不太对。
这是代码:
x2 = Volume
y2 = cumulative_frequency
def rockfall(x,a1,b1):
return a1*x**-b1
V = x2.values
quant = y2.values
c, cov = curve_fit(rockfall,V,quant)
print(c)
n = len(x2)
q = np.empty(n)
for i in range(n):
q[i] = rockfall(x2[i],c[0],c[1])
from sklearn.metrics import r2_score
print('R^2: ',r2_score(quant,q))
print('Samples:',x2.size)
R2=r2_score(quant,q)
该数据
x2 y2
71197 1
12594 2
4780 3
4578 4
3590 5
2624 6
1699 7
1025 8
832.9 9
654.74 10
572.55 11
486.24 12
391.46 13
369.44 14
361 15
356.1 16
314.91 17
300 18
294.7 19
282.45 20
280.7 21
276.6 22
273 23
258.96 24
244.78 25
223 26
190 27
189.7 28
177.04 29
176.16 30
175.8 31
170.03 32
168.23 33
152.8 34
141.6 35
119.75 36
102.76 37
95.27 38
90.16 39
77.82 40
68.58 41
59.92 42
58.25 43
49.44 44
49.05 45
42.9 46
42.25 47
39.55 48
37.78 49
36.31 50
30.84 51
24.73 52
23.2 53
20.64 54
18.67 55
17.63 56
11.13 57
我试着去掉最低值(低于100)。我猜curve_fit的算法与我所寻找的完全不同。
1条答案
按热度按时间vohkndzv1#
您选择的拟合模型并不理想,因此任何拟合方法(Excel或其他方法)都不会产生合理的结果:
第一个
指数衰减更适合:
第一次