По причине нечитаемости файла wiki.en.vec под Windows, этот файл был отфильтрован на другой машине и результата выполнения здесь не будет. Соответственно данные лежат в отфильтрованном файле data.txt. Сначала загрузим данные и преобразуем в формат numpy.array.
import numpy as np
from scipy.cluster.vq import kmeans2
from matplotlib import pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity, euclidean_distances
from sklearn.cluster import KMeans
data = list(open('data.txt').read().split('\n'))
a = len(data)
traindata = []
for j in range(a):
i = a - j - 1
if data[i] is not '':
data[i] = data[i].split(' ')
traindata.append(data[i][1:-1])
else:
data.pop(i)
traindata = np.array(traindata, dtype=np.float)
Посмотрев на гистограммы и средние можно сказать, что распределине близко к нормальному, но тем не менее отклонение от выборочного среднего достигает 0.25, тем не менее общее среднее очень близо к 0.
print(traindata.shape)
for i in range(10):
print(np.mean(traindata[:, i]))
plt.hist(traindata[:, i], bins=100, range=(-1, 1))
plt.title("Признак {}".format(i+1))
plt.xlabel("Значение")
plt.ylabel("Количество элементов")
plt.show()
(19924, 300) -0.045342032386438476
-0.02935998801816904
-0.1540862898480225
0.16802282231500706
-0.1206643013014706
0.016813838235580206
0.06415388072400122
-0.14503732678528405
-0.0020340770753864684
0.10622762763165026
В результате эксперимента хотлесь бы оценить точность кластеризации для различных К алгоритмом K-means. Так же хотелось бы определить оптимальное количество кластеров.
a = len(traindata)
half = int(a/2)
out = []
for k in range(1000, half, 200):
b = KMeans(k, random_state=10).fit(traindata)
print(k)
out.append(b)
1000 1200 1400 1600 1800 2000 2200 2400 2600 2800 3000 3200 3400 3600 3800 4000 4200 4400 4600 4800 5000 5200 5400 5600 5800 6000 6200 6400 6600 6800 7000 7200 7400 7600 7800 8000 8200 8400 8600 8800 9000 9200 9400 9600 9800
Введем функции для оценки внутрикластерного и межкластерного расстояния двумя метриками: косинусной мерой и евклидовым расстоянием.
def clusters(out, K, traindata):
clust = [[] for T in range(K)]
Y = out.labels_
for i in range(len(Y)):
clust[Y[i]].append(traindata[i])
#print(clust[1])
return clust
def int_dist(clust):
#avgeu = []
#avgcos = []
full = 0
eud = 0
cos = 0
for cluster in clust:
#print(cluster)
l = len(cluster)
cs = cosine_similarity(cluster)
eu = euclidean_distances(cluster)
for i in range(l):
for j in range(i + 1, l):
full += 1
cos += cs[i, j]
eud += eu[i, j]
return eud/full, cos/full
def ext_dist(centers):
cs = cosine_similarity(centers)
eu = euclidean_distances(centers)
l = len(centers)
full = l*(l - 1)//2
eud = 0
cos = 0
for i in range(l):
for j in range(i + 1, l):
cos += cs[i, j]
eud += eu[i, j]
return eud/full, cos/full
Воспользуемся этими функциями и рассчитаем значения функционалов для всех К. Так же дополнительно для каждой метрики посчитаем отношения внутрикластерных расстояний к межкластерным.
ic = []
ie = []
ec = []
ee = []
iec = []
iee = []
K = np.arange(1000, half, 200)
for k in K:
i = (k-1000)//200
clust = clusters(out[i], k, traindata)
avg_ie, avg_ic = int_dist(clust)
avg_ee, avg_ec = ext_dist(out[i].cluster_centers_)
ic.append(avg_ic)
ie.append(avg_ie)
ec.append(avg_ec)
ee.append(avg_ee)
iec.append(avg_ic/avg_ec)
iee.append(avg_ie/avg_ee)
print("Для K =", k,
'\nСредняя косинусная схожесть между кластерами', avg_ec,
'\nСреднее евклидово расстояние между кластерами', avg_ee,
'\nСредняя косинусная схожесть внутри кластера', avg_ic,
'\nСреднее евклидово расстояние внутри кластеров', avg_ie,
'\nОтношение в косинусной мере', iec[i],
'\nОтношение в евклидовой метрике', iee[i])
Для K = 1000 Средняя косинусная схожесть между кластерами 0.2849025448291311 Среднее евклидово расстояние между кластерами 4.439397734072058 Средняя косинусная схожесть внутри кластера 0.4080731749947111 Среднее евклидово расстояние внутри кластеров 4.532455650912566 Отношение в косинусной мере 1.4323254825240364 Отношение в евклидовой метрике 1.0209618336573665 Для K = 1200 Средняя косинусная схожесть между кластерами 0.27421467038169756 Среднее евклидово расстояние между кластерами 4.552870053813335 Средняя косинусная схожесть внутри кластера 0.41008739163780594 Среднее евклидово расстояние внутри кластеров 4.580229944099753 Отношение в косинусной мере 1.4954976371868731 Отношение в евклидовой метрике 1.0060093721022199 Для K = 1400 Средняя косинусная схожесть между кластерами 0.2614862941105615 Среднее евклидово расстояние между кластерами 4.756429437679993 Средняя косинусная схожесть внутри кластера 0.4107335317953991 Среднее евклидово расстояние внутри кластеров 4.603577453396553 Отношение в косинусной мере 1.5707650498183776 Отношение в евклидовой метрике 0.9678641328992371 Для K = 1600 Средняя косинусная схожесть между кластерами 0.2482574232571355 Среднее евклидово расстояние между кластерами 4.9626264550804695 Средняя косинусная схожесть внутри кластера 0.4082079256924501 Среднее евклидово расстояние внутри кластеров 4.512077845132141 Отношение в косинусной мере 1.6442929292375843 Отношение в евклидовой метрике 0.9092116616016744 Для K = 1800 Средняя косинусная схожесть между кластерами 0.2440303831337221 Среднее евклидово расстояние между кластерами 4.980376520261026 Средняя косинусная схожесть внутри кластера 0.4196547290573161 Среднее евклидово расстояние внутри кластеров 4.509422978685123 Отношение в косинусной мере 1.7196822939353276 Отношение в евклидовой метрике 0.9054381652351016 Для K = 2000 Средняя косинусная схожесть между кластерами 0.23569827856947473 Среднее евклидово расстояние между кластерами 5.1140661604978 Средняя косинусная схожесть внутри кластера 0.4196496306672191 Среднее евклидово расстояние внутри кластеров 4.509882908022253 Отношение в косинусной мере 1.7804526754043417 Отношение в евклидовой метрике 0.8818585380958903 Для K = 2200 Средняя косинусная схожесть между кластерами 0.23067404800142632 Среднее евклидово расстояние между кластерами 5.164465381728354 Средняя косинусная схожесть внутри кластера 0.4233108868851542 Среднее евклидово расстояние внутри кластеров 4.513808809600239 Отношение в косинусной мере 1.835104081073467 Отношение в евклидовой метрике 0.8740127924121424 Для K = 2400 Средняя косинусная схожесть между кластерами 0.22353829738556635 Среднее евклидово расстояние между кластерами 5.29062036816851 Средняя косинусная схожесть внутри кластера 0.42445972114451347 Среднее евклидово расстояние внутри кластеров 4.448559081157274 Отношение в косинусной мере 1.8988232714879774 Отношение в евклидовой метрике 0.8408388377140851 Для K = 2600 Средняя косинусная схожесть между кластерами 0.22017613381027248 Среднее евклидово расстояние между кластерами 5.325477188015468 Средняя косинусная схожесть внутри кластера 0.4275225657738951 Среднее евклидово расстояние внутри кластеров 4.447251593716978 Отношение в косинусной мере 1.9417298250058959 Отношение в евклидовой метрике 0.8350897838272856 Для K = 2800 Средняя косинусная схожесть между кластерами 0.214668255875133 Среднее евклидово расстояние между кластерами 5.421558799587563 Средняя косинусная схожесть внутри кластера 0.4305732119866381 Среднее евклидово расстояние внутри кластеров 4.388795906708441 Отношение в косинусной мере 2.005760983296438 Отношение в евклидовой метрике 0.809508126526694 Для K = 3000 Средняя косинусная схожесть между кластерами 0.21085083006149052 Среднее евклидово расстояние между кластерами 5.471343355260775 Средняя косинусная схожесть внутри кластера 0.43500558033047637 Среднее евклидово расстояние внутри кластеров 4.385557996010169 Отношение в косинусной мере 2.063096361553879 Отношение в евклидовой метрике 0.8015504988904402 Для K = 3200 Средняя косинусная схожесть между кластерами 0.20729483447159525 Среднее евклидово расстояние между кластерами 5.51006226944155 Средняя косинусная схожесть внутри кластера 0.4399135676367622 Среднее евклидово расстояние внутри кластеров 4.348034133697272 Отношение в косинусной мере 2.1221636745465635 Отношение в евклидовой метрике 0.7891079848246342 Для K = 3400 Средняя косинусная схожесть между кластерами 0.20509213276523222 Среднее евклидово расстояние между кластерами 5.540448492694646 Средняя косинусная схожесть внутри кластера 0.4484134310865372 Среднее евклидово расстояние внутри кластеров 4.272365938787849 Отношение в косинусной мере 2.186399961035236 Отношение в евклидовой метрике 0.7711227609860779 Для K = 3600 Средняя косинусная схожесть между кластерами 0.19982298125578674 Среднее евклидово расстояние между кластерами 5.628524176254878 Средняя косинусная схожесть внутри кластера 0.4408135550397838 Среднее евклидово расстояние внутри кластеров 4.304460383954352 Отношение в косинусной мере 2.2060203099237774 Отношение в евклидовой метрике 0.7647582650730417 Для K = 3800 Средняя косинусная схожесть между кластерами 0.1977083531795413 Среднее евклидово расстояние между кластерами 5.636479719936874 Средняя косинусная схожесть внутри кластера 0.4453621652692246 Среднее евклидово расстояние внутри кластеров 4.2727734206999015 Отношение в косинусной мере 2.2526218953671924 Отношение в евклидовой метрике 0.7580570911284596 Для K = 4000 Средняя косинусная схожесть между кластерами 0.19544628532685596 Среднее евклидово расстояние между кластерами 5.684078290641675 Средняя косинусная схожесть внутри кластера 0.4479120133687332 Среднее евклидово расстояние внутри кластеров 4.22190115400502 Отношение в косинусной мере 2.291739710579121 Отношение в евклидовой метрике 0.7427591489997599 Для K = 4200 Средняя косинусная схожесть между кластерами 0.1932109525231684 Среднее евклидово расстояние между кластерами 5.705755064120349 Средняя косинусная схожесть внутри кластера 0.4529809039004855 Среднее евклидово расстояние внутри кластеров 4.225143324991399 Отношение в косинусной мере 2.3444887465485036 Отношение в евклидовой метрике 0.7405055557958455 Для K = 4400 Средняя косинусная схожесть между кластерами 0.19106850336887854 Среднее евклидово расстояние между кластерами 5.737123508101132 Средняя косинусная схожесть внутри кластера 0.45399756491349724 Среднее евклидово расстояние внутри кластеров 4.190054484279555 Отношение в косинусной мере 2.3760983987874 Отношение в евклидовой метрике 0.7303406451618079 Для K = 4600 Средняя косинусная схожесть между кластерами 0.1891143388186527 Среднее евклидово расстояние между кластерами 5.763458407701363 Средняя косинусная схожесть внутри кластера 0.4657345080261133 Среднее евклидово расстояние внутри кластеров 4.159529659524312 Отношение в косинусной мере 2.46271388481399 Отношение в евклидовой метрике 0.7217072398694128 Для K = 4800 Средняя косинусная схожесть между кластерами 0.1873423682818134 Среднее евклидово расстояние между кластерами 5.804050450035903 Средняя косинусная схожесть внутри кластера 0.4672212122311046 Среднее евклидово расстояние внутри кластеров 4.076471591636492 Отношение в косинусной мере 2.4939431294488497 Отношение в евклидовой метрике 0.702349441433831 Для K = 5000 Средняя косинусная схожесть между кластерами 0.1849593284598245 Среднее евклидово расстояние между кластерами 5.8213468838431055 Средняя косинусная схожесть внутри кластера 0.4616128266900252 Среднее евклидово расстояние внутри кластеров 4.128555234931547 Отношение в косинусной мере 2.4957531503489068 Отношение в евклидовой метрике 0.7092096240459698 Для K = 5200 Средняя косинусная схожесть между кластерами 0.18390722110879276 Среднее евклидово расстояние между кластерами 5.82673817191359 Средняя косинусная схожесть внутри кластера 0.4743308675184057 Среднее евклидово расстояние внутри кластеров 4.0939480008803075 Отношение в косинусной мере 2.579185660348861 Отношение в евклидовой метрике 0.7026140320864619 Для K = 5400 Средняя косинусная схожесть между кластерами 0.18191376308653212 Среднее евклидово расстояние между кластерами 5.866818908997949 Средняя косинусная схожесть внутри кластера 0.4679416267031479 Среднее евклидово расстояние внутри кластеров 4.0449995434031925 Отношение в косинусной мере 2.572326682509223 Отношение в евклидовой метрике 0.6894706664968592 Для K = 5600 Средняя косинусная схожесть между кластерами 0.18180049861249498 Среднее евклидово расстояние между кластерами 5.856403667332999 Средняя косинусная схожесть внутри кластера 0.48049272337680626 Среднее евклидово расстояние внутри кластеров 4.024022149638105 Отношение в косинусной мере 2.642967027285053 Отношение в евклидовой метрике 0.6871148879446421 Для K = 5800 Средняя косинусная схожесть между кластерами 0.17966076576974901 Среднее евклидово расстояние между кластерами 5.87990347280742 Средняя косинусная схожесть внутри кластера 0.48163132000414555 Среднее евклидово расстояние внутри кластеров 4.02486773481528 Отношение в косинусной мере 2.680781849841374 Отношение в евклидовой метрике 0.6845125525323574 Для K = 6000 Средняя косинусная схожесть между кластерами 0.17845064848857825 Среднее евклидово расстояние между кластерами 5.895458467294324 Средняя косинусная схожесть внутри кластера 0.4848811106321581 Среднее евклидово расстояние внутри кластеров 4.00485909286449 Отношение в косинусной мере 2.717172029011668 Отношение в евклидовой метрике 0.6793125785012085 Для K = 6200 Средняя косинусная схожесть между кластерами 0.17741622039151397 Среднее евклидово расстояние между кластерами 5.911856252483661 Средняя косинусная схожесть внутри кластера 0.4771836586682534 Среднее евклидово расстояние внутри кластеров 3.999087592668947 Отношение в косинусной мере 2.6896281389335566 Отношение в евклидовой метрике 0.6764521026689154 Для K = 6400 Средняя косинусная схожесть между кластерами 0.17665223541837527 Среднее евклидово расстояние между кластерами 5.915861112232224 Средняя косинусная схожесть внутри кластера 0.4786066309667663 Среднее евклидово расстояние внутри кластеров 3.9680820718794103 Отношение в косинусной мере 2.7093154515325306 Отношение в евклидовой метрике 0.670753081689935 Для K = 6600 Средняя косинусная схожесть между кластерами 0.1755403917545228 Среднее евклидово расстояние между кластерами 5.921379419541899 Средняя косинусная схожесть внутри кластера 0.4869838791646543 Среднее евклидово расстояние внутри кластеров 3.9345018262737503 Отношение в косинусной мере 2.7741984297588713 Отношение в евклидовой метрике 0.6644569698217614 Для K = 6800 Средняя косинусная схожесть между кластерами 0.1742504097915752 Среднее евклидово расстояние между кластерами 5.945292009765007 Средняя косинусная схожесть внутри кластера 0.48765197245993175 Среднее евклидово расстояние внутри кластеров 3.9131442156444236 Отношение в косинусной мере 2.7985700179599187 Отношение в евклидовой метрике 0.6581920970773468 Для K = 7000 Средняя косинусная схожесть между кластерами 0.1737460100098719 Среднее евклидово расстояние между кластерами 5.946317689940568 Средняя косинусная схожесть внутри кластера 0.49220249681148937 Среднее евклидово расстояние внутри кластеров 3.9103099128264547 Отношение в косинусной мере 2.832885179829588 Отношение в евклидовой метрике 0.6576019171396705 Для K = 7200 Средняя косинусная схожесть между кластерами 0.1725583075299284 Среднее евклидово расстояние между кластерами 5.962314399220996 Средняя косинусная схожесть внутри кластера 0.4905858918150706 Среднее евклидово расстояние внутри кластеров 3.890658327143469 Отношение в косинусной мере 2.843015203599999 Отношение в евклидовой метрике 0.6525416250528153 Для K = 7400 Средняя косинусная схожесть между кластерами 0.17179196885939632 Среднее евклидово расстояние между кластерами 5.963778682643595 Средняя косинусная схожесть внутри кластера 0.4925291962007767 Среднее евклидово расстояние внутри кластеров 3.8845319778988174 Отношение в косинусной мере 2.8670094386303284 Отношение в евклидовой метрике 0.651354147195969 Для K = 7600 Средняя косинусная схожесть между кластерами 0.1711935698803183 Среднее евклидово расстояние между кластерами 5.969406355900676 Средняя косинусная схожесть внутри кластера 0.5003816774252424 Среднее евклидово расстояние внутри кластеров 3.8677644919733387 Отношение в косинусной мере 2.922899953398133 Отношение в евклидовой метрике 0.6479311779721791 Для K = 7800 Средняя косинусная схожесть между кластерами 0.17056974090785768 Среднее евклидово расстояние между кластерами 5.976442106320828 Средняя косинусная схожесть внутри кластера 0.5017838011653454 Среднее евклидово расстояние внутри кластеров 3.8230986858281963 Отношение в косинусной мере 2.941810185643716 Отношение в евклидовой метрике 0.6396947578200073 Для K = 8000 Средняя косинусная схожесть между кластерами 0.1698759342868815 Среднее евклидово расстояние между кластерами 5.980211433056854 Средняя косинусная схожесть внутри кластера 0.5088950168557493 Среднее евклидово расстояние внутри кластеров 3.811669723109949 Отношение в косинусной мере 2.995686345991436 Отношение в евклидовой метрике 0.6373804280631546 Для K = 8200 Средняя косинусная схожесть между кластерами 0.1692126506482103 Среднее евклидово расстояние между кластерами 5.984205219955994 Средняя косинусная схожесть внутри кластера 0.5112388412394786 Среднее евклидово расстояние внутри кластеров 3.7839255177508875 Отношение в косинусной мере 3.0212802605541227 Отношение в евклидовой метрике 0.6323188090429013 Для K = 8400 Средняя косинусная схожесть между кластерами 0.16872901583411942 Среднее евклидово расстояние между кластерами 5.988213693216306 Средняя косинусная схожесть внутри кластера 0.5230856896390906 Среднее евклидово расстояние внутри кластеров 3.7449243724695402 Отношение в косинусной мере 3.1001525555826492 Отношение в евклидовой метрике 0.6253825538510666 Для K = 8600 Средняя косинусная схожесть между кластерами 0.16790174067994879 Среднее евклидово расстояние между кластерами 5.994465338634625 Средняя косинусная схожесть внутри кластера 0.5122957166774318 Среднее евклидово расстояние внутри кластеров 3.747559959775721 Отношение в косинусной мере 3.051163821189683 Отношение в евклидовой метрике 0.6251700106801038 Для K = 8800 Средняя косинусная схожесть между кластерами 0.1674889808580331 Среднее евклидово расстояние между кластерами 5.993639125200632 Средняя косинусная схожесть внутри кластера 0.5223323892349716 Среднее евклидово расстояние внутри кластеров 3.7121150300166637 Отношение в косинусной мере 3.118607484260177 Отношение в евклидовой метрике 0.6193424316136824 Для K = 9000 Средняя косинусная схожесть между кластерами 0.16661542213646227 Среднее евклидово расстояние между кластерами 6.001553415521553 Средняя косинусная схожесть внутри кластера 0.5098228971294846 Среднее евклидово расстояние внутри кластеров 3.7187567500824192 Отношение в косинусной мере 3.0598781949003895 Отношение в евклидовой метрике 0.6196323672575775 Для K = 9200 Средняя косинусная схожесть между кластерами 0.16642368275745667 Среднее евклидово расстояние между кластерами 6.007278072938436 Средняя косинусная схожесть внутри кластера 0.5241684870103833 Среднее евклидово расстояние внутри кластеров 3.6711843468200467 Отношение в косинусной мере 3.1496027387778605 Отношение в евклидовой метрике 0.6111227584682627 Для K = 9400 Средняя косинусная схожесть между кластерами 0.16591494509920635 Среднее евклидово расстояние между кластерами 6.002829226325309 Средняя косинусная схожесть внутри кластера 0.52404529391057 Среднее евклидово расстояние внутри кластеров 3.657308493477967 Отношение в косинусной мере 3.1585177188060123 Отношение в евклидовой метрике 0.6092641245629479 Для K = 9600 Средняя косинусная схожесть между кластерами 0.1653749657463808 Среднее евклидово расстояние между кластерами 6.005208149335568 Средняя косинусная схожесть внутри кластера 0.5251373116133828 Среднее евклидово расстояние внутри кластеров 3.637343051531873 Отношение в косинусной мере 3.175434136861645 Отношение в евклидовой метрике 0.6056980809123691 Для K = 9800 Средняя косинусная схожесть между кластерами 0.1651977727243326 Среднее евклидово расстояние между кластерами 6.006483408585621 Средняя косинусная схожесть внутри кластера 0.534448313112521 Среднее евклидово расстояние внутри кластеров 3.606380092534799 Отношение в косинусной мере 3.2352028983124423 Отношение в евклидовой метрике 0.6004145599369953
Построим графики для каждого функционала и посмотрим на них:
K = np.arange(1000, 10000, 200)
plt.plot(K, ic)
plt.xlabel("K")
plt.ylabel("Внутрекластерная косинусная схожесть")
plt.show()
plt.plot(K, ie)
plt.xlabel("K")
plt.ylabel("Внутрекластерное евклидово расстояние")
plt.show()
plt.plot(K, ec)
plt.xlabel("K")
plt.ylabel("Межкластерная косинусная схожесть")
plt.show()
plt.plot(K, ee)
plt.xlabel("K")
plt.ylabel("Межкластерное евклидово расстояние")
plt.show()
plt.plot(K, iec)
plt.xlabel("K")
plt.ylabel("Отношение косинусных критериев")
plt.show()
plt.plot(K, iee)
plt.xlabel("K")
plt.ylabel("Отношение евклидовых критериев")
plt.show()
По графикам заметно, что где-то в районе К=5000 межкластерные расстояния меняются слабо, таким образом я предполагаю именно К=5000 наиболее оптимальным. Такое число достаточно хорошо соответствует интуитивному представлению, так как это около 4 слов на кластер в среднем. Интересно было бы посмотреть, что из себя представляют такие кластеры:
import random
random.seed()
best = out[20]
for i in range(0,5):
p = random.randint(i*1000, (i + 1)*1000)
print("Кластер №", p)
for j in range(0, len(traindata)):
if best.labels_[j] == p:
print(data[-j - 1][0])
print('\n')
Кластер № 560 parental grandparents maternal fathers pregnant generations relatives childhood parents child children family Кластер № 1750 gratuite gratuit Кластер № 2285 htdocs Кластер № 3237 aussie outback australasia kangaroo australians darwin tasmania victoria wales australian australia Кластер № 4560 disasters disaster
Как можно легко заметить, слова в одном кластере достаточно хорошо связаны по смыслу, а значит в этом плане кластеризация оказалась достаточно успешной. Посмотрим распределение количество слов по кластерам:
K = 5000
arr = out[int((K-1000)/200)].labels_
num = 0
for i in range(0, K):
if i not in arr:
num += 1
plt.hist(arr, bins=K, range=(0, K))
plt.title("K = {}".format(K))
plt.xlabel("Номер кластера")
plt.ylabel("Количество элеменктов в кластере")
plt.show()
clust = clusters(out[int((K-1000)/200)], K, traindata)
single = 0
for cluster in clust:
if len(cluster) == 1:
single += 1
print("Кластеров с одним элементом:", single)
Кластеров с одним элементом: 1732
Видно, что распределение по кластерам достаточно неравномерно: присутствуют кластеры как с большим количеством элементов (до 20), один огромный кластер, в который попало около 90 слов. При этом около трети кластеров состоят всего из одного элемента.
В результате эксперимента можно сказать, что наилучшим К можно считать 5000. Результаты работы самого алгоритма можно оценить как достаточно средние, так как схожесть слов в кластерах следует из того, что данные были очень хорошо предобработаны, а треть кластеров состоят всего из одного элемента.
Далее идут служебные блоки, связанные с сохранением и загрузкой промежуточных результатов. Файлы data.txt, all.pickle и out.pickle так же лежат на Github.
import pickle
with open('out.pickle', 'wb') as f:
pickle.dump(out, f)
import pickle
with open('out.pickle', 'rb') as f:
out = pickle.load(f)
with open('all.pickle', 'wb') as f:
pickle.dump((ic, ie, ec, ee, iec, iee), f)
with open('all.pickle', 'rb') as f:
ic, ie, ec, ee, iec, iee = pickle.load(f)