- library(datasets)
- euclid <- function(x1,x2) #x musi byc postaci x1 - x2
- {
- sqrt(rowSums((x1-x2)^2))
- }
- wymiar <- 2
- k_means <- function(dane, k, max_iter, wymiar)
- #k - liczba klastrow, max_iter - maksymalna liczba iteracji
- {
- #
- # losowanie punktow poczatkowych
- #
- means <- (sample(1:dim(dane)[1],k))
- clusters <- dane[means,1:wymiar]
- print('klastry')
- print(clusters)
- print(dim(clusters))
- #do kazdego klastra zostana przypisane najblizej lezace punkty
- #dla kazdego punktu obliczane sa odleglosci od wszystkich klastrow
- #przypisywany jest do najblizszego
- clustlist = list() #inicjalizacja listy na macierze klastrow
- w = list()
- s = list()
- for (i in 1:max_iter)
- {
- for (j in 1:k) #petla po wszystkich klastrach
- {
- # macierz klastrow
- clustlist[[j]] <- t(matrix(clusters[j,1:wymiar],wymiar,dim(dane)[1]))
- print(clustlist)
- print("dimclustlist")
- print(dim(clustlist[[j]]))
- print("dimeuclid")
- print(dim(euclid(dane[,1:wymiar],unlist(clustlist[[j]]))))
- print("zjebany")
- print(euclid(dane[,1:wymiar],unlist(clustlist[[j]])))
- w[[j]]<-euclid(dane[,1:wymiar],unlist(clustlist[[j]]))
- print(dim(w[[j]]))
- }
- y<-matrix(unlist(w),dim(dane)[1],k)
- for (l in 1:dim(dane)[1])
- {
- dane[l,wymiar+1]<-which.min(y[l,]) # przypisanie numeru klastra
- }
- colnames(dane)[wymiar+1] <- "klaster"
- #wybor nowych srodkow klastrow
- for (m in 1:k)
- {
- u = dane[dane$klaster == m,]
- clusters[m,] <- colSums(u[1:wymiar])/dim(dane)[1]
- }
- print('nowe klastry')
- print(clusters)
- print(dim(clusters))
- }
- return(dane)
- }
- a<-k_means(iris[, 3:4], 3, 2,2)
- colnames(a) <- c("x","y","klaster")
- b<-unlist(a[,wymiar+1])
- b<-replace(b,b==1,'pierwszy')
- b<-replace(b,b==2,'drugi')
- b<-replace(b,b==3,'trzeci')
- b<-replace(b,b==4,'czwarty')
- b<-replace(b,b==5,'piaty')
- b<-replace(b,b==6,'szosty')
- b<-replace(b,b==7,'siodmy')
- b<-replace(b,b==8,'osmy')
- b<-replace(b,b==9,'dziewiaty')
- b<-replace(b,b==10,'dziesiaty')
- a[,wymiar+1]<-b
- library(ggplot2)
- ggplot(a, aes(x, y, color = klaster)) + geom_point()