Advertisement
Guest User

2labaShirapov05370

a guest
Apr 6th, 2020
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.45 KB | None | 0 0
  1. import numpy as np
  2. import pandas
  3. from math import sqrt
  4. from sklearn.datasets import load_iris
  5. import matplotlib.pyplot as plt
  6. import random
  7.  
  8. np.seterr(divide='ignore', invalid='ignore')
  9.  
  10. # расстояние между двумя точками
  11. def dist(p1, p2):
  12.     dist = 0
  13.     for i in range(0, 4):
  14.         dist += pow(p2[i] - p1[i], 2)
  15.     return sqrt(dist)
  16.  
  17. # получить индекс центра к которому ближе всего находится point
  18. def find_nearest_center(centers, point):
  19.     mn_index = 0
  20.     mn = -1
  21.     i = 0
  22.     for row in centers:
  23.         if dist(row, point) < mn or mn == -1:
  24.             mn = dist(row, point)
  25.             mn_index = i
  26.         i += 1
  27.     return mn_index
  28.  
  29. def is_unique(arr, index):
  30.     for i in range(index):
  31.         if arr[i] == arr[index]:
  32.             return False
  33.     return True
  34.  
  35. # получить массив из n различных случайных чисел от mn до mx (включительно)
  36. def get_n_random_numbers(n, mn, mx):
  37.     arr = np.zeros(n)
  38.     for i in range(n):
  39.         arr[i] = random.randint(mn, mx)
  40.         while not is_unique(arr, i):
  41.             arr[i] = random.randint(mn, mx)
  42.     return arr
  43.  
  44. # произвести деление на cluster_count кластеров, перерасчитать центры
  45. # iteration_count раз, перебрать roll_count случайных начальных значений
  46. # и вернуть Q наилучшего выбора
  47. # (Q - среднее средних расстояний внутри кластеров)
  48. def clusterize(cluster_count, iteration_count, roll_count = 1):
  49.     x = np.ndarray(roll_count)
  50.     y = np.ndarray(roll_count)
  51.     color = np.zeros(roll_count)
  52.     cluster_ids = np.zeros(150)
  53.  
  54.     data = load_iris()
  55.     centers = np.ndarray((cluster_count, 4))
  56.     best_centers = np.ndarray((cluster_count, 4))
  57.     best_Q = -1
  58.     for i in range(best_centers.shape[0]):
  59.         for j in range(best_centers.shape[1]):
  60.             best_centers[i][j] = -1
  61.    
  62.     for roll in range(0, roll_count):
  63.         # получение случайных центров для кластеров
  64.         centers_indices = get_n_random_numbers(cluster_count, 0, data.data.shape[0] - 1)
  65.         for i in range(0, cluster_count):
  66.             centers[i] = data.data[int(centers_indices[i])]
  67.        
  68.         for iteration in range(0, iteration_count):
  69.             # распределение точек по кластерам
  70.             clusters = list()
  71.             for i in range(0, cluster_count):
  72.                 clusters.append(list())
  73.             for row in data.data:
  74.                 nearest_cluster = find_nearest_center(centers, row)
  75.                 clusters[nearest_cluster].append(row)
  76.             #print(clusters)
  77.            
  78.             # пересчёт центров кластеров
  79.             for cl in range(0, cluster_count):
  80.                 sums = np.zeros(4)
  81.                 n = 0
  82.                 for row in clusters[cl]:
  83.                     for i in range(0, 4):
  84.                         sums[i] += row[i]
  85.                     n += 1
  86.                 for i in range(0, 4):
  87.                     centers[cl] = sums / n
  88.        
  89.         # вычисление среднего
  90.         Q = 0
  91.         for cluster_index in range(len(clusters)):
  92.             if len(clusters[cluster_index]) == 0:
  93.                 continue
  94.             s = 0.0
  95.             for point in clusters[cluster_index]:
  96.                 s += dist(point, centers[cluster_index])
  97.             Q += s / len(clusters[cluster_index])
  98.  
  99.         x[roll] = roll + 1
  100.         y[roll] = Q
  101.         color[roll] = Q
  102.  
  103.         if Q < best_Q or best_Q == -1:
  104.             best_centers = centers
  105.             best_Q = Q
  106.    
  107.  
  108.     print(f"The best Q for {cluster_count} clusters = {best_Q}")
  109.     for i in range(len(color)):
  110.         if color[i] != best_Q:
  111.             color[i] = 0
  112.         else:
  113.             color[i] = 1
  114.     plt.scatter(x, y, c=color)
  115.     plt.show()
  116.  
  117.     data_x = np.zeros(150)
  118.     data_y = np.zeros(150)
  119.     for i in range(150):
  120.         cluster_ids[i] = find_nearest_center(best_centers, data.data[i])
  121.         data_x[i] = data.data[i][1]
  122.         data_y[i] = data.data[i][3]
  123.  
  124.     plt.scatter(data_x, data_y, c=cluster_ids)
  125.     plt.show()
  126.     print("------------------------------------------------------------")
  127.     #return best_Q
  128.  
  129. for i in range(4):
  130.     clusterize(2 + i, 50, 25)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement