2014-12-31 2 views
0

Я выполняю кластеризацию K с использованием функции kmeans в R. После масштабирования моих данных. После того, как я получу кластеры, вместо того, чтобы получать индивидуальное назначение кластера, я хочу, чтобы расстояние каждой точки от центра кластера. Вот код, который я использую.Расстояние от центров кластера после K означает кластеризацию

data=read.csv("C:/Users/My_Folder/data.csv") # A data frame of 200 rows and 20 variables 
traindata=data[,c(3,4)] # Features on which I want to do clustering 
traindata=scale(traindata,center = T,scale=T) # Feature Scaling 
km.result=rep(0,nrow(traindata)) 
km.cluster = kmeans(traindata, 2,iter.max=20,nstart=25)$cluster 
cluster_1_num = sum(km.cluster==1) 
cluster_2_num = sum(km.cluster==2) 
if(cluster_1_num>cluster_2_num){ 
    km.result[km.cluster==1]=1} 
else{ 
    km.result[km.cluster==2]=1} 
data$cluster=km.result 

Этот код эффективно делит мои 200 рядов на 2 кластера. Вместо меток есть способ получить расстояние от каждой точки от центра кластера. Нужно ли мне масштабировать мои данные до исходных значений.

+0

Как насчет предоставления небольшого воспроизводимого примера для работы? –

+0

@ RomanLuštrik, Ok. Я уже дал код, который я использую. В любом случае, где я могу предоставить CSV-файл моих данных? –

+0

Постройте минимальный, самодостаточный пример. См. [Эту тему] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) о советах о том, как этого достичь. –

ответ

2

Бывает, что вы снимаете только элемент cluster возвращаемого значения kmeans, который также возвращает centers кластеров. Попробуйте это:

#generate some data 
traindata<-matrix(rnorm(400),ncol=2) 
traindata=scale(traindata,center = T,scale=T) # Feature Scaling 
#get the full kmeans 
km.cluster = kmeans(traindata, 2,iter.max=20,nstart=25) 
#define a (euclidean) distance function between two matrices with two columns 
myDist<-function(p1,p2) sqrt((p1[,1]-p2[,1])^2+(p1[,2]-p2[,2])^2) 
#gets the distances 
myDist(traindata[km.cluster$cluster==1,],km.cluster$centers[1,,drop=FALSE]) 
myDist(traindata[km.cluster$cluster==2,],km.cluster$centers[2,,drop=FALSE]) 

Конечно, вы можете написать свою собственную myDist функцию в соответствии с вашими потребностями.

Смежные вопросы