【发布时间】:2017-12-09 01:00:24
【问题描述】:
我正在尝试使用 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)
函数.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 在特征方面没有足够的区别。
【问题讨论】: