sklearn 的 iris 数据集里,样本共有3种分类。我们拿它来演示一下 k-means。
假设我们不知道 iris 里的几百个样本是怎样分类的,但是我们知道一共有3种分类,那么可以让 k-means 聚类成3个簇。
获取数据集
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.feature_names)
print(iris.data[:5])
print("类别:{}".format(iris.target_names))
输出:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
类别:['setosa' 'versicolor' 'virginica']
聚类
model = KMeans(n_clusters=3)
model.fit(iris.data)
predict = model.predict(iris.data)
print("聚类结果:")
print(predict)
输出:
聚类结果:
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 0 0 0 0 2 0 0 0 0
0 0 2 2 0 0 0 0 2 0 2 0 2 0 0 2 2 0 0 0 0 0 2 0 0 0 0 2 0 0 0 2 0 0 0 2 0
0 2]
评估
使用轮廓系数来评估聚类效果:
score = silhouette_score(iris.data, predict)
print("轮廓系数:{}".format(score))
输出:
轮廓系数:0.5525919445213676
轮廓系数的值在(-1, 1)之间。
一般来说,轮廓系数超过 0.1 就算是成功的聚类。 iris 数据集质量很高,这次聚类的轮廓系数达到 0.55,可以说是非常不错的结果了。