Facebook
From b, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 225
  1. library(datasets)
  2.  
  3. euclid <- function(x1,x2) #x musi byc postaci x1 - x2
  4. {
  5.   sqrt(rowSums((x1-x2)^2))
  6. }
  7.  
  8.  
  9. wymiar <- 2
  10.  
  11. k_means <- function(dane, k, max_iter, wymiar)
  12.   #k - liczba klastrow, max_iter - maksymalna liczba iteracji
  13. {
  14.   #
  15.   # losowanie punktow poczatkowych
  16.   #
  17.   means <- (sample(1:dim(dane)[1],k))
  18.   clusters <- dane[means,1:wymiar]
  19.   print('klastry')
  20.   print(clusters)
  21.   print(dim(clusters))
  22.   #do kazdego klastra zostana przypisane najblizej lezace punkty
  23.   #dla kazdego punktu obliczane sa odleglosci od wszystkich klastrow
  24.   #przypisywany jest do najblizszego
  25.   clustlist = list() #inicjalizacja listy na macierze klastrow
  26.   w = list()
  27.   s = list()
  28.   for (i in 1:max_iter)
  29.   {
  30.     for (j in 1:k) #petla po wszystkich klastrach
  31.     {
  32.       # macierz klastrow
  33.       clustlist[[j]] <- t(matrix(clusters[j,1:wymiar],wymiar,dim(dane)[1]))
  34.       print(clustlist)
  35.       print("dimclustlist")
  36.       print(dim(clustlist[[j]]))
  37.       print("dimeuclid")
  38.       print(dim(euclid(dane[,1:wymiar],unlist(clustlist[[j]]))))
  39.       print("zjebany")
  40.       print(euclid(dane[,1:wymiar],unlist(clustlist[[j]])))
  41.       w[[j]]<-euclid(dane[,1:wymiar],unlist(clustlist[[j]]))
  42.       print(dim(w[[j]]))
  43.      
  44.     }
  45.     y<-matrix(unlist(w),dim(dane)[1],k)
  46.     for (l in 1:dim(dane)[1])
  47.     {
  48.       dane[l,wymiar+1]<-which.min(y[l,]) # przypisanie numeru klastra
  49.     }
  50.     colnames(dane)[wymiar+1] <- "klaster"
  51.     #wybor nowych srodkow klastrow
  52.    
  53.     for (m in 1:k)
  54.     {
  55.       u = dane[dane$klaster == m,]
  56.       clusters[m,] <- colSums(u[1:wymiar])/dim(dane)[1]
  57.     }
  58.    
  59.     print('nowe klastry')
  60.     print(clusters)
  61.     print(dim(clusters))
  62.   }
  63.   return(dane)
  64. }
  65.  
  66.  
  67. a<-k_means(iris[, 3:4], 3, 2,2)
  68.  
  69. colnames(a) <- c("x","y","klaster")
  70.                
  71. b<-unlist(a[,wymiar+1])
  72. b<-replace(b,b==1,'pierwszy')
  73. b<-replace(b,b==2,'drugi')
  74. b<-replace(b,b==3,'trzeci')
  75. b<-replace(b,b==4,'czwarty')
  76. b<-replace(b,b==5,'piaty')
  77. b<-replace(b,b==6,'szosty')
  78. b<-replace(b,b==7,'siodmy')
  79. b<-replace(b,b==8,'osmy')
  80. b<-replace(b,b==9,'dziewiaty')
  81. b<-replace(b,b==10,'dziesiaty')
  82.  
  83. a[,wymiar+1]<-b
  84.  
  85.  
  86. library(ggplot2)
  87. ggplot(a, aes(x, y, color = klaster)) + geom_point()