我正在尝试使用R中的K-means聚类来聚类一些数据。要聚类的数据是来自推文样本的一组特定功能。推文标记为 x 或 y 。下面显示了一个数据示例,删除了用户名和ID,这些字段不用于群集。
总共有24.6k个数据项,大约17k标记为 y ,其余标记为 x 。集群后我期望的是两个集群,每个集群中的数据量大致相应。但是,群集似乎将所有数据的最大部分分配给同一个群集,而第二个群集中只有几千个项目。聚类结果如下:
如您所见,几乎所有数据都分配给了集群2。
我不确定我的问题是什么,它可能是我的数据结构或我的R实现的问题。
我尝试了各种不同的聚类和绘图方法,包括ggplot2
。 This 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 之间没有足够的区别。
答案 0 :(得分:0)
您的实施对我来说很好。请考虑一下,它很可能是您的数据结构。看到这种行为并不罕见。通常情况下,你有多数人和少数群体/群集 - 想想它,例如作为一个源自健康&#34;健康&#34;分配,而少数人来自&#34;不健康&#34;分布(以疾病等方式思考)。
还要考虑,它是一种无监督的方法,因此它只是旨在揭示底层数据结构方面的最大差异,这并不意味着它是您的目标的相关差异。再考虑患有疾病的患者,如果你用k-means将它们聚集在一起,那么很可能,你不会根据健康/疾病而是男性和女性来获得聚类。
你可以,例如尝试增加数量k或选择有监督/半监督的聚类方法(R中有很多选项,谷歌是你的朋友)。