Кластеризация
Как найти расстояние между данными
Шаг 1. Сгенерируем данные
dat <- rbind(samp1=c(0,0,0), samp2=c(0,0,3), samp3=c(1,1,1), samp4=c(2,2,2)) dat
Шаг 2. Получаем расстояния, преобразуем в матрицу
dist(dat, method="euclidian") as.matrix(dist(dat, method="euclidian"))
Простейшая иерархическая кластеризация
Шаг 1. Генерируем данные
y <- matrix(rnorm(50), 10, 5, dimnames=list(paste("g", 1:10, sep=""), paste("t", 1:5, sep="")))
Шаг 2. Находим расстояния с помощью корреляции, строим дерево
c <- cor(t(y), method="spearman") d <- as.dist(1-c) hr <- hclust(d, method = "complete", members=NULL) plot(hr)
Шаг 3. Другой вид представления дерева
plot(as.dendrogram(hr), edgePar=list(col=3, lwd=4), horiz=T)
Деревья
Анализ частот слов в блогах: Читаем данные:
blogdata<-read.csv("blogdata1.csv")
выбираем несколько случайных блогов:
idx<- sample(1:dim(blogdata)[1], 10) blogdataSample<-blogdata[idx,]
делаем иерархическую кластеризацию и строим дерево
blogdataSample$Blog<-NULL hc<-hclust(dist(blogdataSample), method="single") hc$labels<-blogdata$Blog[idx] plot(hc, hang=-1)
обрезаем дерево (поскольку выборка у каждого случайная, положение линии определите для Вашего случая):
mycl <-cutree(hc, k=3) plot(hc) abline(h=55, col="red")
Красим ветки: Функция раскраски:
dendroCol <- function(dend=dend, keys=keys, xPar="edgePar", bgr="red", fgr="blue", pch=20, lwd=1, ...) { if(is.leaf(dend)) { myattr <- attributes(dend) if(length(which(keys==myattr$label))==1){ attr(dend, xPar) <- c(myattr$edgePar, list(lab.col=fgr, col=fgr, pch=pch, lwd=lwd)) # attr(dend, xPar) <- c(attr$edgePar, list(lab.col=fgr, col=fgr, pch=pch)) } else { attr(dend, xPar) <- c(myattr$edgePar, list(lab.col=bgr, col=bgr, pch=pch, lwd=lwd)) } } return(dend) }
Теперь красим (имена веток выберите для своего случая):
dend_colored<-dendrapply(as.dendrogram(hc), dendroCol, keys=c("Wonkexe","Signum sine by Guy Kawasaki"), xPar="edgePar", bgr="red", fgr="blue", lwd=2, pch=20) plot(dend_colored)
Метод главных компонент
Шаг 1. Генерируем данные
z1 <- rnorm(10000, mean=1, sd=1) z2 <- rnorm(10000, mean=3, sd=3) z3 <- rnorm(10000, mean=5, sd=5) z4 <- rnorm(10000, mean=7, sd=7) z5 <- rnorm(10000, mean=9, sd=9) mydata <- matrix(c(z1, z2, z3, z4, z5), 2500, 20, byrow=T, dimnames=list(paste("R", 1:2500, sep=""), paste("C", 1:20, sep="")))
Шаг 2. Строим PCA
pca <- prcomp(mydata, scale=T) summary(pca) summary(pca)$importance[, 1:6]
Шаг 3. Рисуем график
mycolors <- c("red", "green", "blue", "magenta", "black") plot(pca$x, pch=20, col=mycolors[sort(rep(1:5, 500))])
Многомерное шкалирование
Шаг 1. Делаем MDS и рисуем
loc <- cmdscale(eurodist) plot(loc[,1], -loc[,2], type="n", xlab="", ylab="", main="cmdscale(eurodist)") text(loc[,1], -loc[,2], rownames(loc), cex=0.8)