关于聚类算法,可以查看:常见的六大聚类算法
K-means通常被称为劳埃德算法,这在数据聚类中是最经典的,也是相对容易理解的模型。算法执行的过程分为4个阶段。
K均值等于具有小的全对称协方差矩阵的期望最大化算法。
sklearn.cluster.KMeans
class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
参数:
n_clusters : int, default=8
要形成的聚类数以及生成的质心数。
init : {‘k-means++’, ‘random’, ndarray, callable}, default=’k-means++’
初始化方法,默认为'k-means++',以智能方式选择k-均值聚类的初始聚类中心,以加速收敛;random,从初始质心数据中随机选择k个观察值
n_init : int,默认值:10使用不同质心种子运行k-means算法的时间。最终结果将是n_init连续运行在惯性方面的最佳输出。
n_jobs : init用于计算的作业数量。这可以通过并行计算每个运行的n_init。如果-1使用所有CPU。如果给出1,则不使用任何并行计算代码,这对调试很有用。对于-1以下的n_jobs,使用(n_cpus + 1 + n_jobs)。因此,对于n_jobs = -2,所有CPU都使用一个。
random_state : 随机数种子,默认为全局numpy随机数生成器。
labels_:默认标记的类型,可以和真实值比较(不是值比较)
# 关于其它更多参数介绍访问:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-using-sklearn-cluster-kmeans]
使用kmeans的方式案例:
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],[4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0)
方法
fit(X,y=None)
使用X作为训练数据拟合模型
kmeans.fit(X)
predict(X)
预测新的数据所在的类别
kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
属性
cluster_centers_
集群中心的点坐标
kmeans.cluster_centers_
array([[1.,2.],[4.,2.]])
labels_
每个点的类别
kmeans.labels_
sklearn.metrics.silhouette_score
sklearn.metrics.silhouette_score(X, labels)
计算所有样本的平均轮廓系数
X:特征值
labels : 被聚类标记的目标值
手写数字数据上K-Means聚类的演示
# -*- coding: UTF-8 -*-
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
def kmeans():
"""
手写数字聚类过程
:return: None
"""
# 加载手写数字数据集
ld = load_digits()
print(ld.data)
print("------------------------------------------")
print(ld.target)
print("---------查看第一个样本数据----------------")
# 查看第一个样本数据
print(ld.data[0])
print("------------------------------------------")
# print(ld.target[:20])
# 聚类
km = KMeans(n_clusters=810)
km.fit_transform(ld.data)
print(km.labels_[:20])
# (silhouette : /ˌsɪluˈet/ n:轮廓,剪影, vt. 使…照出影子来;使…仅仅显出轮廓)
print(silhouette_score(ld.data,km.labels_))
if __name__=="__main__":
kmeans()
输出结果:
[[ 0. 0. 5. ... 0. 0. 0.]
[ 0. 0. 0. ... 10. 0. 0.]
[ 0. 0. 0. ... 16. 9. 0.]
...
[ 0. 0. 1. ... 6. 0. 0.]
[ 0. 0. 2. ... 12. 0. 0.]
[ 0. 0. 10. ... 12. 1. 0.]]
------------------------------------------
[0 1 2 ... 8 9 8]
---------查看第一个样本数据----------------
[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 0. 0. 3.
15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 8. 0. 0. 5. 8. 0.
0. 9. 8. 0. 0. 4. 11. 0. 1. 12. 7. 0. 0. 2. 14. 5. 10. 12.
0. 0. 0. 0. 6. 13. 10. 0. 0. 0.]
------------------------------------------
[209 579 30 233 33 646 712 369 211 784 162 81 158 735 73 46 284 564
622 720]
0.09647323481043048
再如案例:https://www.cnblogs.com/moon2/p/9872706.html
特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:
容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)