书籍:《R语言与数据挖掘》
作者:张良均
出版社:机械工业出版社
ISBN:9787111540526
本书由北京华章图文信息有限公司授权杭州云悦读网络有限公司电子版制作与发行
版权所有·侵权必究
写在前面
目前主流的聚类算法主要分为以下几种
- K-Means K-均值聚类
- K-Medoids K-中心聚类
- DBSSCAN Density-based Spatial Clustering of Application with Noise 密度聚类
- HC Hierarchical Clustering 层次聚类,或者叫系谱聚类
- EM Expectation Maximization 期望最大聚类
K-Means K-均值聚类
但对于异常值或极值敏感,稳定性差,因此适合处理分布集中的大样本数据集。
聚类过程描述:
它的思路是以随机选取的k(预设类别数)个样本作为起始中心点,将其余样本归入相似度最高中心点所在的簇(cluster),再确立当前簇中样本坐标的均值为新的中心点,依次循环迭代下去,直至所有样本所属类别不再变动。算法的计算过程非常直观,下图以将10个点聚为3类为例展示算法步骤。
code showing
# K - Means聚类
# 设置工作空间
setwd("D:/数据及程序/第7章/示例程序")
# 读入数据
Data <- read.csv("./data/consumption_data.csv", header = TRUE)[, 2:4]
# K - Means聚类分析建模,聚类个数为3
km <- kmeans(Data, center = 3)
# 查看聚类结果
print(km)
# 聚类后各类数据所占比例
km$size / sum(km$size)
# 将数据按聚类结果分组
Data.cluster <- data.frame(Data, km$cluster)
Data1 <- Data[which(Data.cluster$km.cluster == 1), ]
Data2 <- Data[which(Data.cluster$km.cluster == 2), ]
Data3 <- Data[which(Data.cluster$km.cluster == 3), ]
# 客户分群“1”的概率密度函数图
par(mfrow = c(1, 3))
plot(density(Data1[, 1]), col = "red", main = "R")
plot(density(Data1[, 2]), col = "red", main = "F")
plot(density(Data1[, 3]), col = "red", main = "M")
# 客户分群“2”的概率密度函数图
par(mfrow = c(1, 3))
plot(density(Data2[, 1]), col = "red", main = "R")
plot(density(Data2[, 2]), col = "red", main = "F")
plot(density(Data2[, 3]), col = "red", main = "M")
# 客户分群“3”的概率密度函数图
par(mfrow = c(1, 3))
plot(density(Data3[, 1]), col = "red", main = "R")
plot(density(Data3[, 2]), col = "red", main = "F")
plot(density(Data3[, 3]), col = "red", main = "M")
kmeans(x, centers, iter.max = 10, nstart = 1, algorithm = c(“Hartigan-Wong”,
“Lloyd”, “Forgy”, “MacQueen”), trace = FALSE)
其中x为进行聚类分析的数据集; centers为预设类别数k; iter.max为迭代的最大值,且默认值为10; nstart为选择随机起始中心点的次数,默认取1;而参数algorithm则提供了4中算法选择,默认为Hartigan-Wong算法。
K-Medoids K-中心聚类
# K - 中心点聚类
# 加载函数包cluster
library(cluster)
# 设置随机种子
set.seed(0)
# 生成服从正态分布的随机数数据集
x <- rbind(cbind(rnorm(10, 0, 0.5), rnorm(10, 0, 0.5)),
cbind(rnorm(15, 5, 0.5), rnorm(15, 5, 0.5)))
# K - 中心点聚类
pamx <- pam(x, 2) # 聚为2类
# 查看聚类结果
print(pamx)
# 绘制聚类结果
plot(pamx)
DBSSCAN Density-based Spatial Clustering of Application with Noise 密度聚类
# 加载函数fpc包
library(fpc)
# 设置随机种子
set.seed(665544)
# 示例数据
n <- 600
x <- cbind(runif(10, 0, 10) + rnorm(n, sd = 0.2), runif(10, 0, 10) + rnorm(n, sd = 0.2))
# 密度聚类
ds <- dbscan(x, 0.2)
# 查看聚类结果
print(ds)
# 绘制聚类结果
plot(ds, x)
HC Hierarchical Clustering 层次聚类,或者叫系谱聚类
层次聚类(系谱聚类)的名称在于,其聚类的过程可以通过类似于系谱图的形式呈现出来。相比K-均值算法与K-中心点算法,系谱算法的突出特点在于,不需事先设定类别数k,这是因为它每次迭代过程仅将距离最近的两个样本/簇聚为一类,其运作过程将自然得到k=n至k=1(n为待分类样本总数)个类别的聚类结果。
code showing
# 层次聚类
# 生成等差序列
n <- seq(1, 50, by = 4)
# 对示例数据集USArrests进行等差抽样
(x <- USArrests[n, ])
# 聚类的合并方法为"complete"
hc1 <- hclust(dist(x), method = "complete")
# 将数据中心标准化后聚类
hc2 <- hclust(dist(scale(x)), method = "complete")
# 聚类的合并方法为"ave"
hc3 <- hclust(dist(x), method = "ave")
# 查看聚类结果
print(hc1);print(hc2);print(hc3)
# 对聚类结果进行剪枝
# 利用剪枝函数cutree()中的参数k控制输出聚类结果
cutree(hc1, k = 4)
cutree(hc2, k = 4)
cutree(hc3, k = 4)
# 利用剪枝函数cutree()中的参数H控制输出聚类结果
cutree(hc1, h = 50)
cutree(hc2, h = 2)
cutree(hc3, h = 50)
# 绘制聚类树,并使用rect.hclust()在聚类树中查看聚类结果
# 分别绘制聚类树
plot(hc1)
plot(hc2)
plot(hc3)
# 用红色矩形框出4分类的聚类结果
rect.hclust(hc3, k = 4, border = "red")
# 用深灰色矩形框出高度指标为100时的聚类结果
rect.hclust(hc3, h = 100, border = "dark grey")
EM Expectation Maximization 期望最大聚类
# EM聚类
# 加载函数包mclust
library(mclust)
nNoise <- 100
set.seed(0) # 设置随机种子
# 生成示例数据
Noise <- apply(faithful, 2, function(x)
runif(nNoise, min = min(x) - .1, max = max(x) + .1))
data <- rbind(faithful, Noise)
# 绘制示例数据散点图
plot(faithful)
points(Noise, pch = 20, cex = 0.5)
# EM聚类
set.seed(0)
NoiseInit <- sample(c(TRUE, FALSE), size = nrow(faithful) + nNoise,
replace = TRUE, prob = c(3, 1) / 4)
mod5 <- Mclust(data, initialization = list(noise = NoiseInit))
# 查看模型建模结果
summary(mod5, parameter = TRUE)
# 绘制聚类结果的概率分布图
plot(mod5, what = "classification")
距离选择
使用格式为:dist(x, method = “euclidean”,d iag = FALSE, upper = FALSE, p = 2)
其中,x是样本矩阵或者数据框;method表示计算距离的方法,method的取值有:euclidean(欧几里德距离,即欧氏距离)、maximum(切比雪夫距离)、manhattan(曼哈顿距离,即绝对值距离)、canberra(Lance距离)、minkowski(明可夫斯基距离,使用时要指定p值)、binary(定性变量距离),默认选择euclidean; diag 为TRUE的时候给出对角线上的距离;upper为TURE的时候给出上三角矩阵上的值。