K-means与R

时间:2017-07-05 11:22:29

标签: r k-means

我正在尝试使用R中的K-means聚类来聚类一些数据。要聚类的数据是来自推文样本的一组特定功能。推文标记为 x y 。下面显示了一个数据示例,删除了用户名和ID,这些字段不用于群集。

example data

总共有24.6k个数据项,大约17k标记为 y ,其余标记为 x 。集群后我期望的是两个集群,每个集群中的数据量大致相应。但是,群集似乎将所有数据的最大部分分配给同一个群集,而第二个群集中只有几千个项目。聚类结果如下:

clustering results

如您所见,几乎所有数据都分配给了集群2。

我不确定我的问题是什么,它可能是我的数据结构或我的R实现的问题。

我尝试了各种不同的聚类和绘图方法,包括ggplot2This question有一些用处,但我的结果保持不变。

我的R实现如下。请注意,规范化方法取自this answer。任何人都可以指出我正确的方向,为什么我的数据被分配到同一个集群,即使我有两个不同的标签?

Clustering.R

#Imports
library(jsonlite)
library(tm)
library(fpc)

#Includes
source("./Clustering_Functions.R")

#Program 
rawData <- getInput()
clusterData <- filterData(rawData)
clusterData <- scaleData(clusterData)
aCluster <- performClustering(clusterData)
table(rawData$stance, aCluster$cluster)
plotOutput(clusterData, aCluster)

Functions.R

getInput <- function() {
  json_file <- "path/file.json"

  #Set data to dataframe
  frame <- fromJSON(json_file)
  return(frame)
}

#Filter the raw data, remove columns not for clustering
filterData <- function(frame) {
  kcFrame <- frame[c( -3, -4, -9)]
  return (kcFrame)
}

#Scale the columns to uniform data, values 0-100
scaleData <- function(kcFrame) {
  doScale <- function(x) x* 100/max(x, na.rm = TRUE)
  kcFrame <- data.frame(lapply(kcFrame, doScale))
  return (kcFrame)
}

#Apply K-means clustering
performClustering <- function(kcFrame) {
  kc <- kmeans(kcFrame, centers = 2)
  return (kc)
}

#Graph the clusters
plotOutput <- function(kcFrame, kc) {
  plotcluster(kcFrame, kc$cluster)
}

编辑:我怀疑问题出在我的数据上;在功能方面,标签 x y 之间没有足够的区别。

1 个答案:

答案 0 :(得分:0)

您的实施对我来说很好。请考虑一下,它很可能是您的数据结构。看到这种行为并不罕见。通常情况下,你有多数人和少数群体/群集 - 想想它,例如作为一个源自健康&#34;健康&#34;分配,而少数人来自&#34;不健康&#34;分布(以疾病等方式思考)。

还要考虑,它是一种无监督的方法,因此它只是旨在揭示底层数据结构方面的最大差异,这并不意味着它是您的目标的相关差异。再考虑患有疾病的患者,如果你用k-means将它们聚集在一起,那么很可能,你不会根据健康/疾病而是男性和女性来获得聚类。

你可以,例如尝试增加数量k或选择有监督/半监督的聚类方法(R中有很多选项,谷歌是你的朋友)。