【问题标题】:Kmeans clustering identifying knowledge in RKmeans聚类识别R中的知识
【发布时间】:2015-04-18 19:30:12
【问题描述】:

我是 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 - 唯一标识每个产品 home_key - 唯一标识每个家庭 BASKET_ID - 唯一标识购买场合 DAY - 交易发生的日期 QUANTITY - 旅行期间购买的产品数量 SALES_VALUE - 零售商从销售中获得的美元金额 STORE_ID - 标识唯一商店 RETAIL_DISC - 由于制造优惠券而应用的折扣 TRANS_TIME - 交易发生的时间 WEEK_NO - 交易发生的周数 1-102 制造商 - 将同一制造商的产品链接在一起的代码 部门 - 将相似的产品组合在一起 BRAND - 表示私人或国家标签乐队 COMMODITY_DESC - 在较低级别将相似产品组合在一起 SUB_COMMODITY_DESC - 在最低级别将相似产品组合在一起

【问题讨论】:

  • 您可能对cluster 包中的函数clusGap 感兴趣。它为许多可能的 k 值计算“聚类优度”统计量。你的问题是不可重现的,因为你没有提供样本数据。此外,您关于如何识别有用集群的问题是统计和机器学习中一个复杂的、未解决的问题。不是真正的编程问题。
  • 嗨,我刚刚在我的数据集中添加了所有变量。我无法理解可以使用哪些特征来识别数据集中有意义的内容?

标签: r k-means


【解决方案1】:

样本数据

我整理了一些示例数据,以便更好地帮助您:

#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

我有一个包含数据点的矩阵。每个数据点有 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,]

这将输出一个矩阵,在最后一列中包含所有值和数据点 ID:

            [,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") 

使用参数 col(这代表颜色)通过键入 col= result$cluster 为数据点提供与它们的集群从属相对应的颜色

如果您还想查看图中的聚类中心,请添加以下行:

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

绘图现在应该如下所示(变量 2 与变量 3):

(点是数据点,X 是聚类中心)

【讨论】:

    【解决方案2】:

    我对 k-means 函数并不是很熟悉,如果没有任何样本数据,它很难提供帮助。然而,这可能会有所帮助:

    kmeans 返回一个“kmeans”类的对象,它有一个 print 和一个 fit 方法。它是一个至少包含以下组件的列表:

    • cluster:一个整数向量(从 1:k 开始),表示每个点被分配到的集群。
    • centers:聚类中心矩阵。
    • totss:平方和。
    • withinss: 簇内平方和的向量,每个簇一个分量。
    • tot.withinss: 簇内总平方和,即 sum(withinss)。
    • betweenss: 簇间平方和,即 totss-tot.withinss。
    • size:每个簇中的点数。
    • iter:(外部)迭代次数。
    • ifault: 整数:可能存在算法问题的指标 – 供专家使用。

    更多here.

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

    results$cluster
    

    或了解有关中心的更多详细信息:

    results$centers
    

    【讨论】:

    • 嗨@maRtin谢谢你的回答,我已经完成了你提到的那个阶段,一旦我运行了我的K意味着我有例如4个集群,现在我希望检索所有这些数据分配给它的簇号。你能帮助我如何在 R 中实现这一目标吗?
    • 我添加了一个新答案。我希望这会有所帮助。但是,如果您喜欢我的回答,我会很高兴获得支持。谢谢
    • 很抱歉现在才看到这个,我想每次有人写答案时都会收到一封电子邮件通知,但我想它不起作用。如果你能允许我一些时间,我想分析你的答案,我会给你一个更新。谢谢你:)
    • 嘿马丁我刚刚完成了你上面所说的一切,我已经用我自己的数据得到了一些结果,我想找出每个集群的平均值和标准差,你知道怎么做吗那个?
    猜你喜欢
    • 2017-04-09
    • 2016-04-04
    • 1970-01-01
    • 2018-07-06
    • 2022-12-17
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多