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]])) } w<-matrix(unlist(w),dim(dane)[1],k) for (l in 1:dim(dane)[1]) { dane[l,wymiar+1]<-which.min(w[l,]) # przypisanie numeru klastra } colnames(dane)[wymiar+1] <- "klaster" remove(w) #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], 2, 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()