Forum >> Programmazione Python >> Calcolo scientifico >> [Python] Fit Power Law

Pagina: 1

Avrei bisogno di chiedere una cortesia:
Se inviassi una funzione, che ho elaborato ma che non torna, me la potreste correggere o dirmi dove sbaglio in tempi brevi?
E' per un progetto di lavoro che devo consegnare lunedì.

Si tratta della FIT POWER LAW che con un file di dati torna correttamente ma che con il file che ho poi scelto di esaminare non torna.

Fatemi sapere che allego poi immagine, codice e file dati.

Ringrazio anticipatamente chi mi risponderà.


--- Ultima modifica di mm mm in data 2021-09-25 16:34:41 ---
from scipy.stats import linregress
import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt
self.degr = [ 358, 124, 106, 96, 94, 92, 90, 88, 84, 80, 76, 74, 72, 70, 68, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2 ]

self.cnt = [ 1, 1, 1, 1, 2, 1,, 1, 1, 1, 3, 1, 1, 3, 2, 6, 3, 3, 7, 2, 1, 1, 16, 4, 5, 9, 6, 10, 10, 9, 15, 19, 35, 21, 29, 30, 49, 43, 55, 52, 66, 70, 99, 110, 186, 238, 418, 835] 
x = np.array(self.degr, dtype=int)
y = np.array(self.cnt, dtype=int)
logA = np.log10(x) ; logB = np.log10(y)
fitfunc = lambda p, x: p[ 0 ] + p[ 1 ] * x
errfunc = lambda p, x, y: (y - fitfunc(p, x))
pinit = [1.0, -1.0]
out = optimize.leastsq(errfunc, pinit, args=(logA, logB), full_output=1)
pfinal = out[ 0 ]
index = pfinal[ 1 ]
amp = 10.0**pfinal[ 0 ]
xdata = np.linspace(1, max(x), len(x))    # min(x)
powerlaw = lambda x, amp, index: amp * (x**index)
ydata = powerlaw(xdata, amp, index)
new_xdata = []; new_ydata = []
    
# TUTTO DIPENDE DA QUESTO CICLO FOR
for i in range(len(ydata)):
   # if ydata >= 1.0 :    # min(y)): 
   if float(min(y)) <= ydata <= float(max(y)) :
       new_ydata.append(ydata) ; new_xdata.append(xdata)
   else: continue

# a_POWERLAW viene 7541.582 anzichè 7544.etc 
a_POWERLAW = np.around(amp, 3) # Non è preciso 
b_POWERLAW = np.around(index, 3) #ok
corr_POWERLAW = np.corrcoef(logA, logB, rowvar=0)[0,1] # NON TORNA
#corr_POWERLAW = np.corrcoef(new_xdata, new_ydata, rowvar=0)[0,1]
# Corr corretto = 0.733   NON TORNA
R_squared_POWERLAW = np.around( linregress(logA, logB).rvalue**2, 3)  #ok

plt.loglog(new_xdata, new_ydata, "r-", linewidth=2.0)
plt.scatter(self.degr, self.cnt, alpha=0.6)
plt.set_xscale('log')
plt.set_yscale('log')
plt.show()   
La immagine allegata taglia nella direzione giusta ma viene spezzata.
Ho fatto dei test con 2 file: il primo con meno nodi e interazioni non dava problemi, 
mentre con il secondo file che ho poi deciso di analizzare perchè contenente più informazioni, 
mi ritorna una FIT troncata seppur nella direzione giusta. 
Sta attraversando correttamente i punti che deve.

Mi potreste aiutare a capire cosa sbaglio ? Grazie
--- Ultima modifica di mm mm in data 2021-10-11 16:31:31 ---
Allegati


Pagina: 1



Esegui il login per scrivere una risposta.