R 中的模糊 C 均值聚类
Fuzzy C-Means Clustering in R
我正在对一些数据执行模糊聚类。我首先缩放数据框,因此每个变量的平均值为 0
,标准差为 1.
然后我 运行 包 clValid
中的 clValid
函数如下:
library(dplyr)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
intvalid <- clValid(clust, 2:10, clMethods=c("fanny"),
validation="internal", maxitems = 1000)
结果告诉我 4 是最好的簇数。因此我 运行 cluster
包中的 fanny
函数如下:
res.fanny <- fanny(clust, 4, metric='SqEuclidean')
res.fanny$coeff
res.fanny$k.crisp
df$fuzzy<-res.fanny$clustering
profile<-ddply(df,.(fuzzy),summarize,
count=length(fuzzy))
但是,在查看 profile
时,我只有 3 个集群而不是 4 个。这怎么可能?我应该选择 3 个集群而不是 4 个集群吗?我该如何解释呢?我不知道如何重新创建我的数据,因为它非常大。其他人以前遇到过这个吗?
首先,我鼓励阅读 clValid package 的精彩小插图。
R 包 clValid
包含用于验证聚类分析结果的函数。可以使用三种主要类型的集群验证措施。其中一项措施是邓恩指数,即不在同一集群中的观察值与较大的集群内距离之间的比率。为简单起见,我关注 Dunn 指数。一般来说,连接性应该最小化,而邓恩指数和轮廓宽度都应该最大化。
clValid
创建者在他们的文档中明确提到 cluster
包的 fanny
功能。
clValid
包可用于 运行 多个 algorithms/metrics 跨预先指定的聚类集。
library(dplyr)
library(clValid)
iris
table(iris$Species)
clust <- sapply(iris[, -5], scale)
在我的代码中,我需要增加迭代以达到收敛 (maxit = 1500)。
结果是通过将汇总函数应用于 clValid 对象 intvalid 获得的。
似乎最佳的簇数是2(但这里不是重点)。
intvalid <- clValid(clust, 2:5, clMethods=c("fanny"),
maxit = 1500,
validation="internal",
metric="euclidean")
summary(intvalid)
可以从 clValid
对象中提取任何方法的结果,以便使用 clusters
方法进行进一步分析。这里提取了 2 个聚类解的结果 (hc$
2),重点是 Dunnett 系数 (hc$
2$coeff
)。当然,这个结果与 clValid
调用的 "euclidean" 指标有关。
hc <- clusters(intvalid, "fanny")
hc$`2`$coeff
现在,我只需使用欧氏度量和 2 个集群从 cluster
包中调用 fanny
。结果与上一步完全重叠。
res.fanny <- fanny(clust, 2, metric='euclidean', maxit = 1500)
res.fanny$coeff
现在,我们可以看一下分类table
table(hc$`2`$clustering, iris[,5])
setosa versicolor virginica
1 50 0 0
2 0 50 50
和 profile
df$fuzzy <- hc$`2`$clustering
profile <- ddply(df,.(fuzzy), summarize,
count=length(fuzzy))
profile
fuzzy count
1 1 50
2 2 100
这是基于有限信息的回答尝试,可能无法完全解决提问者的情况。听起来可能还有其他问题。在聊天中,他们表示他们遇到了我无法重现的其他错误。 Fanny 将根据指标计算项目并将其分配给 "crisp" 个集群。它还将生成一个矩阵,显示可以使用 membership
访问的模糊聚类分配。
可以通过使用 iris 数据集增加 memb.exp
参数来重现提问者描述的问题。这是一个例子:
library(plyr)
library(clValid)
library(cluster)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
res.fanny <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 2)
调用 res.fanny$k.crisp
表明这会产生 4 个脆簇。
res.fanny14 <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 14)
调用 res.fanny14$k.crisp
表明这会产生 3 个脆簇。
仍然可以使用 res.fanny14$membership
访问 4 个集群中每个集群的成员资格。
如果您有充分的理由认为应该有 4 个脆簇,则可以减少 memb.exp
参数。这将收紧集群分配。或者,如果您正在进行某种监督学习,调整此参数的一个过程是保留一些测试数据,进行超参数网格搜索,然后 select 在您的首选指标上产生最佳结果的值。然而,在不了解更多关于任务、数据或提问者试图完成的内容的情况下,很难提出比这更多的建议。
我正在对一些数据执行模糊聚类。我首先缩放数据框,因此每个变量的平均值为 0
,标准差为 1.
然后我 运行 包 clValid
中的 clValid
函数如下:
library(dplyr)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
intvalid <- clValid(clust, 2:10, clMethods=c("fanny"),
validation="internal", maxitems = 1000)
结果告诉我 4 是最好的簇数。因此我 运行 cluster
包中的 fanny
函数如下:
res.fanny <- fanny(clust, 4, metric='SqEuclidean')
res.fanny$coeff
res.fanny$k.crisp
df$fuzzy<-res.fanny$clustering
profile<-ddply(df,.(fuzzy),summarize,
count=length(fuzzy))
但是,在查看 profile
时,我只有 3 个集群而不是 4 个。这怎么可能?我应该选择 3 个集群而不是 4 个集群吗?我该如何解释呢?我不知道如何重新创建我的数据,因为它非常大。其他人以前遇到过这个吗?
首先,我鼓励阅读 clValid package 的精彩小插图。
R 包 clValid
包含用于验证聚类分析结果的函数。可以使用三种主要类型的集群验证措施。其中一项措施是邓恩指数,即不在同一集群中的观察值与较大的集群内距离之间的比率。为简单起见,我关注 Dunn 指数。一般来说,连接性应该最小化,而邓恩指数和轮廓宽度都应该最大化。
clValid
创建者在他们的文档中明确提到 cluster
包的 fanny
功能。
clValid
包可用于 运行 多个 algorithms/metrics 跨预先指定的聚类集。
library(dplyr)
library(clValid)
iris
table(iris$Species)
clust <- sapply(iris[, -5], scale)
在我的代码中,我需要增加迭代以达到收敛 (maxit = 1500)。 结果是通过将汇总函数应用于 clValid 对象 intvalid 获得的。 似乎最佳的簇数是2(但这里不是重点)。
intvalid <- clValid(clust, 2:5, clMethods=c("fanny"),
maxit = 1500,
validation="internal",
metric="euclidean")
summary(intvalid)
可以从 clValid
对象中提取任何方法的结果,以便使用 clusters
方法进行进一步分析。这里提取了 2 个聚类解的结果 (hc$
2),重点是 Dunnett 系数 (hc$
2$coeff
)。当然,这个结果与 clValid
调用的 "euclidean" 指标有关。
hc <- clusters(intvalid, "fanny")
hc$`2`$coeff
现在,我只需使用欧氏度量和 2 个集群从 cluster
包中调用 fanny
。结果与上一步完全重叠。
res.fanny <- fanny(clust, 2, metric='euclidean', maxit = 1500)
res.fanny$coeff
现在,我们可以看一下分类table
table(hc$`2`$clustering, iris[,5])
setosa versicolor virginica
1 50 0 0
2 0 50 50
和 profile
df$fuzzy <- hc$`2`$clustering
profile <- ddply(df,.(fuzzy), summarize,
count=length(fuzzy))
profile
fuzzy count
1 1 50
2 2 100
这是基于有限信息的回答尝试,可能无法完全解决提问者的情况。听起来可能还有其他问题。在聊天中,他们表示他们遇到了我无法重现的其他错误。 Fanny 将根据指标计算项目并将其分配给 "crisp" 个集群。它还将生成一个矩阵,显示可以使用 membership
访问的模糊聚类分配。
可以通过使用 iris 数据集增加 memb.exp
参数来重现提问者描述的问题。这是一个例子:
library(plyr)
library(clValid)
library(cluster)
df<-iris[,-5] # I do not use iris, but to make reproducible
clust<-sapply(df,scale)
res.fanny <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 2)
调用 res.fanny$k.crisp
表明这会产生 4 个脆簇。
res.fanny14 <- fanny(clust, 4, metric='SqEuclidean', memb.exp = 14)
调用 res.fanny14$k.crisp
表明这会产生 3 个脆簇。
仍然可以使用 res.fanny14$membership
访问 4 个集群中每个集群的成员资格。
如果您有充分的理由认为应该有 4 个脆簇,则可以减少 memb.exp
参数。这将收紧集群分配。或者,如果您正在进行某种监督学习,调整此参数的一个过程是保留一些测试数据,进行超参数网格搜索,然后 select 在您的首选指标上产生最佳结果的值。然而,在不了解更多关于任务、数据或提问者试图完成的内容的情况下,很难提出比这更多的建议。