Strumenti Utente

Strumenti Sito


distribuzione_delle_frequenze_in_scala_logaritmica

Distribuzione delle frequenze in scala logaritmica

Il codice seguente traccia il grafico della distribuzione delle frequenze in scala logaritmica. Le rr. 16-17 creano un 'subplot' denominato 'ax'; le rr.18-19 definiscono la scala di questo elemento come logaritmica; la r. 20 traccia, in blu, i punti relativi ai valori di frequenza osservati. Le righe 21-23 tracciano, in rosso, una retta che corrisponde al modello ideale secondo la legge di Zipf con parametri C=5850,7 e a=1,03372 (vedi sotto).

distribuzione_logaritmica.py
import re
import matplotlib.pyplot as plt
import numpy as np
with open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') as f: 
	testo = f.read()
testo=testo[1704:]
testo=re.sub("'","' ", testo)
testo=re.sub('[\.,;:\-?!]{1}','',testo)
testo=testo.lower()
testo=testo.split()
fd=[testo.count(i) for i in set(testo)]
fd.sort(reverse=True)
V=len(set(testo))
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.set_xscale('log')
ax.set_yscale('log')
ax.plot(range(1,V+1),fd, 'b.')
x=np.arange(1,V+1)
y=5850.7/(x**1.03372)
ax.plot(x,y, 'r-')
plt.show()

Dovrebbe prodursi un grafico di questo tipo:


Il codice seguente ricava i parametri C=5850,7 e a=1,03372 attraverso la tecnica della regressione lineare. Per eseguire questo script è necessario aver installato il modulo scikit-learn mediante il comando pip install sklearn (Windows) o pip3 install sklearn (MacOs e Linux).

regressione_lineare.py
import re
import numpy as np
from sklearn.linear_model import LinearRegression
with open('testi/collodi_pinocchio.txt', mode='r', encoding='iso-8859-1') as f: 
	testo = f.read()
testo=testo[1704:]
testo=re.sub("'","' ", testo)
testo=re.sub('[\.,;:\-?!]{1}','',testo)
testo=testo.lower()
testo=testo.split()
fd=[testo.count(i) for i in set(testo)]
fd.sort(reverse=True)
V=len(set(testo))
Y=np.array([np.log(i) for i in fd])
X=np.array(list(np.log(i) for i in range(1,V+1))).reshape((-1, 1))
model = LinearRegression().fit(X, Y)
C=np.exp(model.intercept_)
a=model.coef_[0]*-1
print('C:', C)
print('a:', a)
distribuzione_delle_frequenze_in_scala_logaritmica.txt · Ultima modifica: 2021/10/29 21:22 da deleteme