繁体   English   中英

R的K均值聚类

[英]K-means Clustering with R

我正在尝试使用R中的K均值聚类对某些数据进行聚类。要聚类的数据是来自推文样本的一组特定功能。 这些推文被标记为xy 数据示例如下所示,用户名和ID被删除,这些字段不用于集群。

示例数据

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

聚类结果

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

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

我尝试了聚类和绘图的各种不同方法,包括ggplot2 这个问题是有用的,但是我的结果保持不变。

我的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)

功能

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)
}

编辑:我怀疑问题在于我的数据; 在特征方面,标签xy之间没有足够的区别。

您的实现对我来说很好。 请考虑,这很可能就是您的数据结构。 看到这种行为并不罕见。 通常,您拥有多数族和少数族群/群体-例如,将其视为源自“健康”分布的一个群体,而少数族裔则来自“不良”分布(例如,根据疾病进行思考)。

还请考虑,这是一种无监督的方法,因此,它的目的只是揭示基础数据结构方面的最大差异,这并不意味着它是与您的目标相关的差异。 再次考虑让患者患有疾病,如果没有,如果您将他们与k均值进行聚类,则很可能不会根据健康/疾病获得聚类,而是根据男性和女性来分类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM