聚类算法,属于无监督学习
K-Means算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心对应的类,以之作为聚类的标准。 质心: 指一个类,内部所有样本点的均值。 kmeans(x,centers)
代码实现:
pColumns <- c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width');
plot(iris[, c("Sepal.Length", "Sepal.Width")])
#分类模型训练
kmc <- kmeans(iris[, pColumns], 3);
table(iris$Species, kmc$cluster); #查看分类概括
prop.table(table(iris$Species, kmc$cluster), 1)
#聚类结果可视化
#不同的颜色代表不同的聚类结果,不同的形状代表训练数据集的原始分类情况。
plot(
iris[c("Sepal.Length", "Sepal.Width")],
col = kmc$cluster,
pch = as.integer(iris$Species)
);
points(
kmc$centers[, c("Sepal.Length", "Sepal.Width")],
col = 1:3,
pch = 8,
cex=2
)
K-Means算法的优化
多维的数据映射为一维的数据,主成分分析,崖底碎石法
#install.packages("psych")
library(psych)
pColumns <- c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width');
#主成份分析
fp <- fa.parallel(
iris[, pColumns],
fa="pc",
n.iter=100,
show.legend=FALSE
)
#崖底碎石法,拿到主成份个数
pc <- principal(iris[, pColumns], nfactors=fp$ncomp)
> fp$ncomp
[1] 1
data <- pc$scores;
#分类模型训练
kc <- kmeans(data, 3);
table(iris$Species, kc$cluster); #查看分类概括
prop.table(table(iris$Species, kc$cluster), 1)
1 2 3
setosa 0.00 0.00 1.00
versicolor 0.90 0.10 0.00
virginica 0.12 0.88 0.00
#聚类结果可视化
#不同的颜色代表不同的聚类结果,不同的形状代表训练数据集的原始分类情况。
stripchart(
data[,1]~kc$cluster,
at=c(1, 1, 1),
col=c("orange",'black', "red"),
pch=c(0, 1, 2)
);
points(
kc$centers, c(1, 1, 1),
col = c("orange","red", 'black'),
pch = 8,
cex=2
)