Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. import sys
  2. import random
  3. import math
  4. import numpy
  5. import matplotlib
  6. import matplotlib.pyplot as plt
  7. from mpl_toolkits.mplot3d import Axes3D
  8.  
  9.  
  10.  
  11. # obrazek biblioteka graficzna - trzeba zrobić scatter plot
  12. # k liczba klastrów trzeba je wylosować calkowite
  13. # odległość euklidesowa
  14. # symulacja dla wszystkich k 2,3,4
  15. # wczytywanie liczb z pliku
  16. # błąd dystorsji
  17. # liczby losowe
  18. # szukamy ustawień wektorów k które najlepiej opiszą nam
  19. # wylosować liczbe z biblioteki
  20. # biblioteka sqrt do policzenia pierwiastka
  21. # dla przykładu m=2
  22. # funkcja random.uniform
  23. def czytanie(plik):
  24. try:
  25. tablica = []
  26. with open(plik, 'r') as plik:
  27. print("\n\n Mozna korzystac z pliku")
  28. for linia in plik:
  29. tablica.append([ float(i) for i in linia.split()])
  30. print(tablica)
  31. return tablica
  32. except IOError:
  33. print("Brak dostepu do pliku")
  34. sys.exit(0)
  35.  
  36. def printTab(tab):
  37. for x in tab:
  38. print(x)
  39. print("")
  40.  
  41. def randomPoint(min,max, dimension):
  42. return [random.uniform(min,max) for i in range(dimension)]
  43.  
  44.  
  45.  
  46. def distance(p1,p2): #odległosc euklidesowa miedzy 2 punktami
  47. dist = 0
  48. if len(p1) != len(p2):
  49. raise ValueError("Wymiary nie sa równe!")
  50.  
  51. for i,val in enumerate(p1):
  52. dist = dist + (p1[i] - p2[i])*(p1[i] - p2[i])
  53. return math.sqrt(dist)
  54.  
  55. def centerOfGravity(v):
  56. array = numpy.array(v.copy())
  57. transposed = array.T.tolist() #transpozycja tablicy
  58. result = []
  59. for i in transposed:
  60. result.append(sum(i)/len(i))
  61. return result
  62.  
  63. def assignToClasters(v, centroids):
  64. clasters = [[] for i in range(len(centroids))] #tablica 2d
  65.  
  66. for point in v:
  67. minDistance = 99999
  68. clossest = 0
  69. for key,centroid in enumerate(centroids):
  70. if distance(point,centroid) < minDistance:
  71. minDistance = distance(point,centroid)
  72. clossest = key
  73. clasters[clossest].append(point)
  74.  
  75.  
  76.  
  77. return clasters
  78.  
  79. def error(centroids,clasters):
  80.  
  81. error = 0
  82. for key,value in enumerate(centroids):
  83. for point in clasters[key]:
  84. error = error + distance(point, value)
  85. return error
  86.  
  87. def draw(clasters):
  88. fig = plt.figure()
  89. ax = fig.gca(projection='3d')
  90. printTab(clasters)
  91. for claster in clasters :
  92. if claster:
  93. array = numpy.array(claster.copy())
  94. t = array.T.tolist()
  95. ax.scatter(t[0],t[1],t[2])
  96.  
  97.  
  98.  
  99. plt.show()
  100.  
  101.  
  102. def lloyd(v,K):
  103.  
  104. bestError = 999999
  105. bestCentroids = []
  106.  
  107. for x in range(500):
  108. centroids = [randomPoint(0,15,len(v[0])) for i in range(K)]
  109. #print( "Centroid:" ,centroids)
  110. clasters = assignToClasters(v,centroids)
  111. currentError = error(centroids,clasters)
  112. #print("error:", currentError)
  113. if currentError < bestError:
  114. bestError = currentError
  115. bestCentroids = centroids[:]
  116.  
  117. #print("cnetroid",key, centroids[key])
  118.  
  119. print("Best error: ", bestError)
  120. printTab(bestCentroids)
  121. clasters = assignToClasters(v,bestCentroids)
  122.  
  123. draw(clasters)
  124. return
  125.  
  126.  
  127. plik = 'liczby.txt'
  128. tab = czytanie(plik)
  129.  
  130.  
  131.  
  132. print("---")
  133. lloyd(tab, 3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement