Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import random
- import math
- import numpy
- import matplotlib
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- # obrazek biblioteka graficzna - trzeba zrobić scatter plot
- # k liczba klastrów trzeba je wylosować calkowite
- # odległość euklidesowa
- # symulacja dla wszystkich k 2,3,4
- # wczytywanie liczb z pliku
- # błąd dystorsji
- # liczby losowe
- # szukamy ustawień wektorów k które najlepiej opiszą nam
- # wylosować liczbe z biblioteki
- # biblioteka sqrt do policzenia pierwiastka
- # dla przykładu m=2
- # funkcja random.uniform
- def czytanie(plik):
- try:
- tablica = []
- with open(plik, 'r') as plik:
- print("\n\n Mozna korzystac z pliku")
- for linia in plik:
- tablica.append([ float(i) for i in linia.split()])
- print(tablica)
- return tablica
- except IOError:
- print("Brak dostepu do pliku")
- sys.exit(0)
- def printTab(tab):
- for x in tab:
- print(x)
- print("")
- def randomPoint(min,max, dimension):
- return [random.uniform(min,max) for i in range(dimension)]
- def distance(p1,p2): #odległosc euklidesowa miedzy 2 punktami
- dist = 0
- if len(p1) != len(p2):
- raise ValueError("Wymiary nie sa równe!")
- for i,val in enumerate(p1):
- dist = dist + (p1[i] - p2[i])*(p1[i] - p2[i])
- return math.sqrt(dist)
- def centerOfGravity(v):
- array = numpy.array(v.copy())
- transposed = array.T.tolist() #transpozycja tablicy
- result = []
- for i in transposed:
- result.append(sum(i)/len(i))
- return result
- def assignToClasters(v, centroids):
- clasters = [[] for i in range(len(centroids))] #tablica 2d
- for point in v:
- minDistance = 99999
- clossest = 0
- for key,centroid in enumerate(centroids):
- if distance(point,centroid) < minDistance:
- minDistance = distance(point,centroid)
- clossest = key
- clasters[clossest].append(point)
- return clasters
- def error(centroids,clasters):
- error = 0
- for key,value in enumerate(centroids):
- for point in clasters[key]:
- error = error + distance(point, value)
- return error
- def draw(clasters):
- fig = plt.figure()
- ax = fig.gca(projection='3d')
- printTab(clasters)
- for claster in clasters :
- if claster:
- array = numpy.array(claster.copy())
- t = array.T.tolist()
- ax.scatter(t[0],t[1],t[2])
- plt.show()
- def lloyd(v,K):
- bestError = 999999
- bestCentroids = []
- for x in range(500):
- centroids = [randomPoint(0,15,len(v[0])) for i in range(K)]
- #print( "Centroid:" ,centroids)
- clasters = assignToClasters(v,centroids)
- currentError = error(centroids,clasters)
- #print("error:", currentError)
- if currentError < bestError:
- bestError = currentError
- bestCentroids = centroids[:]
- #print("cnetroid",key, centroids[key])
- print("Best error: ", bestError)
- printTab(bestCentroids)
- clasters = assignToClasters(v,bestCentroids)
- draw(clasters)
- return
- plik = 'liczby.txt'
- tab = czytanie(plik)
- print("---")
- lloyd(tab, 3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement