首先是一些背景:
R 是不错的选择,并且在不同的包中有很多聚类方法。这些功能包括层次聚类、分区聚类、基于模型的聚类和聚类回归。
基于连通性的聚类或分层聚类(也称为分层聚类分析或 HCA)是一种聚类分析方法,旨在构建聚类的层次结构。层次聚类的策略通常分为两种类型:
- 凝聚:这是一种“自下而上”的方法:每个观察都从其自己的集群开始,当一个集群向上移动时,成对的集群被合并。
- 分裂:这是一种“自上而下”的方法:所有观察都从一个集群开始,并且随着一个层次向下移动,递归地执行拆分。在这种方法中,在不同的距离,会形成不同的簇,可以用树状图来表示。
基于质心的聚类:在基于质心的聚类中,聚类由一个中心向量表示,它不一定是数据集的成员。当聚类的数量固定为 k 时,k-means 聚类给出了一个优化问题的正式定义:找到 k 个聚类中心并将对象分配到最近的聚类中心,使得与聚类的平方距离最小化。
km <- kmeans(iris[,1:4], 3)
plot(iris[,1], iris[,2], col=km$cluster)
points(km$centers[,c(1,2)], col=1:3, pch=8, cex=2)
table(km$cluster, iris$Species)
基于分布的聚类:与统计最密切相关的聚类模型是基于分布模型的。然后可以轻松地将集群定义为最有可能属于同一分布的对象。问题是过拟合。
基于密度的聚类:n 个基于密度的聚类,[8] 聚类被定义为密度高于数据集其余部分的区域。这些稀疏区域中的对象 - 需要分离集群 - 通常被认为是噪声点和边界点。
在基于密度的簇中,簇沿密度分布扩展。有两个参数很重要:“eps”定义了每个点的邻域半径,“minpts”是我的“eps”半径内的邻居数。称为 DBscan 的基本算法如下进行:
第一次扫描:对于每个点,计算与所有其他点的距离。如果邻居计数小于“eps”,则增加邻居计数。
第二次扫描:对于每个点,如果其邻居数大于“mints”,则将其标记为核心点
第三次扫描:对于每个核心点,如果尚未为其分配集群,则创建一个新集群并将其分配给该核心点以及“eps”半径内的所有邻居。
与其他集群不同,基于密度的集群可能有一些异常值(不属于任何集群的数据点)。另一方面,它可以检测任意形状的簇(根本不必是圆形的)。
library(fpc)
# eps is radius of neighborhood, MinPts is no of neighbors
# within eps
cluster <- dbscan(sampleiris[,-5], eps=0.6, MinPts=4)
plot(cluster, sampleiris)
plot(cluster, sampleiris[,c(1,4)])
# Notice points in cluster 0 are unassigned outliers
table(cluster$cluster, sampleiris$Species)
随着最近需要处理越来越大的数据集(也称为大数据),以生成集群的语义来换取性能的意愿一直在增加。这导致了诸如树冠聚类之类的预聚类方法的发展,它可以有效地处理庞大的数据集,但由此产生的“聚类”只是对数据集进行粗略的预分区,然后用现有的较慢的方法分析分区,例如作为k-means聚类。
对于高维数据,许多现有方法由于维数灾难而失败,这使得特定距离函数在高维空间中存在问题。这导致了新的高维数据聚类算法,专注于子空间聚类(仅使用一些属性,聚类模型包括聚类的相关属性)和相关聚类,也寻找任意旋转(“相关”)子空间可以通过给出其属性的相关性来建模的集群。三种聚类算法包括PROCLUS、P3C 和 STATPC。
对于你的问题:
包 Package ' orclus ' 可用于执行子空间聚类和分类。以下是手册中的示例:
# definition of a function for parameterized data simulation
sim.orclus <- function(k = 3, nk = 100, d = 10, l = 4, sd.cl = 0.05, sd.rest = 1, locshift = 1){
### input parameters for data generation
# k # nk # d # l
# sd.cl
# sd.rest # locshift
number of clusters
observations per cluster
original dimension of the data
subspace dimension where the clusters are concentrated
(univariate) standard deviations for data generation (within cluster subspace concentration) standard deviations in the remaining space
parameter of a uniform distribution to sample different cluster means
x <- NULL
for(i in 1:k){
# cluster centers
apts <- locshift*matrix(runif(l*k), ncol = l)
# sample points in original space
xi.original <- cbind(matrix(rnorm(nk * l, sd = sd.cl), ncol=l) + matrix(rep(apts[i,], nk), ncol = l, byrow = TRUE)
matrix(rnorm(nk * (d-l), sd = sd.rest), ncol = (d-l)))
# subspace generation
sym.mat <- matrix(nrow=d, ncol=d)
for(m in 1:d){
for(n in 1:m){
sym.mat[m,n] <- sym.mat[n,m] <- runif(1)
}
}
subspace <- eigen(sym.mat)$vectors
# transformation
xi.transformed <- xi.original %*% subspace
x <- rbind(x, xi.transformed)
}
clids <- rep(1:k, each = nk)
result <- list(x = x, cluster = clids)
return(result)
}
# simulate data of 2 classes where class 1 consists of 2 subclasses
simdata <- sim.orclus(k = 3, nk = 200, d = 15, l = 4, sd.cl = 0.05, sd.rest = 1, locshift = 1)
x <- simdata$x
y <- c(rep(1,400), rep(2,200))
res <- orclass(x, y, k = 3, l = 4, k0 = 15, a = 0.75)
res
# compare results
table(res$predict.train$class, y)
您可能还对HDclassif(高维数据的基于模型的聚类和判别分析的 R 包)感兴趣。