Forum
>>
Programmazione Python
>>
Calcolo scientifico
>>
[Python] Fit Power Law
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da mm mm |
2021-09-25 16:34:24 - [Python] Fit Power Law
|
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 --- |
|
Scritto da mm mm |
2021-10-11 16:15:00 - Re: [Python] Fit Power Law
|
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 ---
|
Pagina: 1
Esegui il login per scrivere una risposta.