jotto

Untitled

Oct 9th, 2015
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | None | 0 0
  1. # coding=UTF-8
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import axes3d, Axes3D
  4. from numpy import random as rand
  5. import numpy as np
  6. import functools as fnc
  7.  
  8.  
  9. dimensions = 8
  10.  
  11.  
  12. def dist(p1, p2):
  13.     return np.sqrt(
  14.         np.power(p2[0]-p1[0], 2) +
  15.         np.power(p2[1]-p1[1], 2) +
  16.         np.power(p2[2]-p1[2], 2) +
  17.         np.power(p2[3]-p1[3], 2) +
  18.         np.power(p2[4]-p1[4], 2) +
  19.         np.power(p2[5]-p1[5], 2) +
  20.         np.power(p2[6]-p1[6], 2) +
  21.         np.power(p2[7]-p1[7], 2)
  22.     )
  23.  
  24. # napisałem własną, bo jakoś nie wierzyłem w twoją
  25. def distance(a, b):
  26.     distances = [a[x] - b[x] for x in range(dimensions)]
  27.     distances = [d**2 for d in distances]
  28.     return np.sqrt(sum(distances))
  29.  
  30. points = [
  31.     (float(x.split()[0]),
  32.      float(x.split()[1]),
  33.      float(x.split()[2]),
  34.      float(x.split()[3]),
  35.      float(x.split()[4]),
  36.      float(x.split()[5]),
  37.      float(x.split()[6]),
  38.      float(x.split()[7])) for x in open('yeast.txt', 'r').readlines()
  39.     ]
  40.  
  41.  
  42. # wszystkie wartości w pliku są z przedziału 0 - 1, wystarczy numpy.random, żeby losować takie liczby
  43. # python.random musi mieć argumenty, np nie
  44. clusters = 2
  45. c = [(
  46.          rand.uniform(),
  47.          rand.uniform(),
  48.          rand.uniform(),
  49.          rand.uniform(),
  50.          rand.uniform(),
  51.          rand.uniform(),
  52.          rand.uniform(),
  53.          rand.uniform()
  54.      ) for _ in range(clusters)]
  55.  
  56.  
  57. # nie możesz losować pozycji poprzedniego punktu, bo może się okazać, że będzie on bliżej niż aktualny
  58. # musisz mieć pewność, że jest on dalej. Nic nie jest bardziej pewne niż nieskończoność
  59. old_c = [(
  60.              float("inf"),
  61.              float("inf"),
  62.              float("inf"),
  63.              float("inf"),
  64.              float("inf"),
  65.              float("inf"),
  66.              float("inf"),
  67.              float("inf"),
  68.          ) for _ in range(clusters)]
  69. c_moved = [[] for _ in range(clusters)]
  70. c_affiliation = [[] for _ in range(clusters)]
  71.  
  72. while True:
  73.     for p in points:
  74.         # tmp_c = 0
  75.  
  76.         # stworzyłem liste odległości punktu od każdego klastru, potem szukam jaki indeks (czyli indeks klastru też)
  77.         # to chyba był błąd krytyczny ten if, nie wiem czemu, ale zawsze wg. niego pierwszy klaster leżał bliżej niż drugi
  78.         # wstawiłem tu nawet warunkowego breakpointa gdy drugi punkt jest bliżej, ale nigdy się nie pokazał
  79.         vDist = []
  80.         for i in range(clusters):
  81.             vDist.append(distance(p, c[i]))
  82.             # if distance(p, c[i]) < distance(p, c[tmp_c]):
  83.             #     tmp_c = i
  84.         iBelong = vDist.index(min(vDist))
  85.         c_affiliation[iBelong].append(p)
  86.  
  87.     # print(c_affiliation[0])
  88.     # print(c_affiliation[1])
  89.     # print("-------------------------")
  90.  
  91.     # tu musi być obsluga błędów, bo klaster może nie mieć żadnych punktów
  92.     for i in range(clusters):
  93.         c[i] = (
  94.             fnc.reduce(lambda x, y: x + y, [j[0] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  95.             fnc.reduce(lambda x, y: x + y, [j[1] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  96.             fnc.reduce(lambda x, y: x + y, [j[2] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  97.             fnc.reduce(lambda x, y: x + y, [j[3] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  98.             fnc.reduce(lambda x, y: x + y, [j[4] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  99.             fnc.reduce(lambda x, y: x + y, [j[5] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  100.             fnc.reduce(lambda x, y: x + y, [j[6] for j in c_affiliation[i]]) / len(c_affiliation[i]),
  101.             fnc.reduce(lambda x, y: x + y, [j[7] for j in c_affiliation[i]]) / len(c_affiliation[i])
  102.         )
  103.  
  104.     error = 0.001
  105.     flag = False
  106.     # for i in range(clusters):
  107.     #     if not (abs(c[i][0] - old_c[i][0]) < error * (len(points[:][0])*0.1) and abs(c[i][1] - old_c[i][1]) < error):
  108.     #         flag = True
  109.  
  110.     # tutaj wystarczy sprawdzić czy odległość punktu poprzedniego od aktualnego jest większa od błędu, jak tak to lecimy dalej
  111.     # nawet mi się nie chciało czytać tego ifa - tak nasrane tam
  112.     for i in range(clusters):
  113.         if distance(c[i], old_c[i]) > error:
  114.             flag = True
  115.  
  116.     if flag:
  117.         for i in range(clusters):
  118.             c_moved[i].append(old_c[i])
  119.         old_c = np.copy(c)
  120.         c_affiliation.clear()
  121.         c_affiliation = [[] for _ in range(clusters)]
  122.     else:
  123.         print(c_affiliation[0])
  124.         print(c_affiliation[1])
  125.         break
  126.  
  127. # print(c_affiliation)
  128. display_points = [[c_affiliation[ci][pi][:3] for ci in range(clusters) for pi in range(len(c_affiliation[ci]))]]
  129. display_centroids = [c[i][:3] for i in range(clusters)]
  130.  
  131. fig = plt.figure()
  132. #ax = fig.add_subplot(111, projection='3d')
  133. ax = Axes3D(fig)
  134.  
  135. # for i in range(clusters-1):
  136. #     ax.scatter(*zip(*display_points[i]), marker='x', c=np.random.rand(3, 1))
  137.  
  138. # nie chciało mi się ogarniać jak Ty to wyświetlasz, ale nawet jak udało mi się podzielić ten zbiór to punkty były
  139. # wyświetlane w tym samym kolorze
  140. c_affiliation[0] = [x[:3] for x in c_affiliation[0]]
  141. c_affiliation[1] = [x[:3] for x in c_affiliation[1]]
  142. print(c_affiliation)
  143.  
  144. ax.scatter(*zip(*c_affiliation[0]), marker='x', c='black')
  145. ax.scatter(*zip(*c_affiliation[1]), marker='x', c='red')
  146. ax.scatter(*zip(*display_centroids), marker='o', c='red', s=75)
  147. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment