Kmeans聚类识别R中的知识

问题描述:

我是R和聚类世界的新手。我正在使用购物数据集来从中提取功能,以便识别有意义的内容。Kmeans聚类识别R中的知识

到目前为止我已经学会了如何合并文件,删除na,做错误平方和,锻炼平均值,按小组总结,做K平均聚类并绘制结果X,Y.

但是,我很困惑如何查看这些结果或确定什么是有用的集群?我是在重复一些事情还是错过了某些东西?我对绘制X Y变量也很困惑。

下面是我的代码,也许我的代码可能是错误的。能否请你帮忙。任何帮助都会很棒。

# Read file 
mydata = read.csv(file.choose(), TRUE) 

#view the file 
View(mydata) 

#create new data set 
mydata.features = mydata 

mydata.features <- na.omit(mydata.features) 

wss <- (nrow(mydata.features)-1)*sum(apply(mydata.features,2,var)) 
for (i in 2:20) wss[i] <- sum(kmeans(mydata.features, centers=i)$withinss) 
plot(1:20, wss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares") 

# K-Means Cluster Analysis 
fit <- kmeans(mydata.features, 3) 
# get cluster means 
aggregate(mydata.features,by=list(fit$cluster),FUN=mean) 
# append cluster assignment 
mydata.features <- data.frame(mydata.features, fit$cluster) 

results <- kmeans(mydata.features, 3) 

plot(mydata[c("DAY","WEEK_NO")], col= results$cluster 

样本数据变量,下面都是我有我的数据集内的变量,它的购物数据集收集了2年

PRODUCT_ID - 唯一标识每个产品 household_key - 唯一标识每个家庭 BASKET_ID - 唯一标识购买机会 DAY - 交易发生的日期 QUANTITY - 行程期间购买的产品数量 SALES_VALUE - 美元零售商从销售中获得的金额 STORE_ID - 标识独特商店 RETAIL_DISC - disccount应用由于制造券 TRANS_TIME - 一天的时间,当交易发生的 WEEK_NO - 交易周出现1-102 制造商 - 代码链接产品具有相同的制造一起 部 - 集团同类产品一起 品牌 - 表明私人或国家的标签带 COMMODITY_DESC - 同类产品组在一起下级 SUB_COMMODITY_DESC - 在最低水平

+0

您可能感兴趣的函数'clusGap'在'cluster'包中。它计算k的许多可能值的'聚类'统计的好处。由于您尚未提供样本数据,因此您的问题无法重现。另外,关于如何识别有用群集的问题在统计和机器学习中是一个复杂的,未解答的问题。不是一个真正的编程问题。 – bdemarest 2015-02-18 00:58:24

+0

嗨我刚刚添加了我的数据集中的所有变量。我很难理解哪些特征可以用于识别数据集中有意义的内容? – user2704941 2015-02-18 08:15:22

我并不真正熟悉的群体同类产品共同的k-means功能,其努力帮助没有任何样本数据。然而在这里可能有所帮助:

kmeans返回一个类“kmeans”的对象,它有一个打印和一个拟合的方法。它与至少以下组件的列表:

  • 群集:整数向量(从1:K)表示群集,其中每个点被分配。
  • 中心:聚类中心矩阵。
  • totss:总平方。
  • 范围:群集内正方形向量,每个群集一个组件。
  • tot.withinss:总的群内平方和总和,即sum(withinss)。
  • betweenss:群集之间的平方和,即totss-tot.withinss。
  • 大小:每个群集中的点数。
  • iter:(外部)迭代次数。
  • ifault:整数:指示可能的算法问题 - 专家。

更多here

您可以像这样访问这些组件: 即,如果你想看看集群:

results$cluster 

或对中心的详细信息:

results$centers 
+0

嗨@maRtin谢谢你的回答,我已经完成了你提到的那个阶段,一旦我运行了我的K意味着我有例如4个集群,现在我希望检索具有分配的集群编号的所有数据。你能帮助我如何在R中实现这一点吗? – user2704941 2015-02-18 16:12:37

+0

我添加了一个新答案。我希望这个帮助。但是,如果你喜欢我的答案,我会很乐意接受upvote。 Thx – maRtin 2015-02-19 19:03:07

+0

对不起,现在看到了这个,我想每次有人写回答都会收到一封电子邮件通知,但我猜它不工作。如果你能让我有一段时间,我想分析你的答案,我会给你一个更新。谢谢:) – user2704941 2015-02-20 15:54:01

样本数据

我把一些样本数据,所以我可以帮助你更好:

#generate sample data 
sampledata <- matrix(data=rnorm(200,0,1),50,4) 

#add ID to data 
sampledata <-cbind(sampledata, 1:50) 

#show data: 
head(sampledata) 
      [,1]  [,2]  [,3]  [,4] [,5] 
[1,] 0.72859559 -2.2864943 -0.5408501 0.1564730 1 
[2,] 0.34852943 0.3100891 0.6007349 -0.5985266 2 
[3,] -0.04605026 0.5067896 -0.2911211 -1.1617171 3 
[4,] -1.88358617 1.3739440 -0.5655383 0.9518367 4 
[5,] 0.35528650 -1.7482304 -0.3871520 -0.7837712 5 
[6,] 0.38057682 0.1465488 -0.6006462 1.3827544 6 

我有一个矩阵与DA ta点。每个数据点有4个变量(第1 - 4列)和一个id(第5列)。

应用的K-means

之后,我应用的k-means功能(但只列1:4,因为它没有多大意义,群集ID):

#kmeans (4 centers) 
result <- kmeans(sampledata[,1:4], 4) 

分析输出

如果我想看到的数据点属于我可以输入该集群:

result$cluster 

其结果将是,例如:

[1] 4 3 2 2 1 2 4 4 3 3 3 3 2 1 4 4 4 2 4 4 4 1 1 1 3 3 3 3 1 3 2 2 4 4 2 4 2 3 1 2 2 2 1 2 1 1 4 1 1 1 

这意味着,数据点1属于类4,第二个数据点属于类3,等等... 如果我想检索属于群1的所有数据点,我可以做到以下几点:

sampledata[result$cluster==1,] 

这将输出一个矩阵,在最后一列的所有值和数据点号:

  [,1]   [,2]  [,3]  [,4] [,5] 
[1,] 0.3552865 -1.748230422 -0.3871520 -0.78377121 5 
[2,] 0.5806156 0.479576142 1.1314052 1.60730796 14 
[3,] 1.1871472 1.280881477 -1.7227361 -0.89045074 22 
[4,] 0.8482060 0.726470349 0.6851352 -0.78526581 23 
[5,] -0.5324139 -1.745802580 0.6779943 0.99915708 24 
[6,] 0.2472263 -0.006298136 -0.1457003 -0.44789364 29 
[7,] 0.1412812 -0.247076976 0.9181507 -0.58570904 39 
[8,] 0.1859786 -1.768692166 0.5681229 -0.80618157 43 
[9,] -1.1577178 -0.179886998 1.5183880 0.40014071 45 
[10,] 1.0667566 -1.602875994 0.6010581 -0.49514049 46 
[11,] 0.2464646 1.226129859 -1.3628096 -0.37666716 48 
[12,] 1.2660358 0.282688323 0.7650636 0.23442255 49 
[13,] -0.2499337 0.855327072 0.2290221 0.03492807 50 

如果我想知道点有多少数据是第1组中,我可以输入:

sum(result$cluster==1) 

这将返回13,以及对应于上述矩阵的行数。

最后一些绘图:

首先,让图中的数据。既然你有一个多维数据框,并且你只能在一个标准图中绘制两个维度,你必须这样做。选择要绘制的变量,例如var 2和3(第2列和第3列)。这相当于:

sampledata[,2:3] 

绘制该数据,简单地写:

plot(sampledata[,2:3], col=result$cluster ,main="Affiliation of observations") 

使用argumemnt山坳(这代表颜色)通过键入相应的给个数据点的颜色到他们的簇隶属关系山坳= $结果集群

如果你也想看到的情节聚类中心,添加以下行:

+ points(result$centers, col=1:4, pch="x", cex=3) 

情节现在应该是这样的(可变2比变量3):

(该点是数据点,该X's是聚类中心) enter image description here