K-means聚类
问题背景
用于解决以下问题:有n个点,每个点都有m个特征值(一般不会太多),将其分为k类。
要求:类与类之间的差距尽可能大,类之间各点的差距尽可能小。这一目标我们使用轮廓系数来衡量。
下面我将展示如何调用python中的sklearn快速地完成聚类算法。
需要导入的库
from sklearn.metrics import silhouette_score
from Bio.Cluster import kcluster
from sklearn.cluster import KMeans
中心点坐标以及分类结果
# 这里的X是原始点坐标,n行m列,表示有n个点,每个点的特征值数量为m个
# 这里n_clusters=4表示分为4类
K = KMeans(n_clusters=4, random_state=0)
# 这句话必不可少
y_pred = K.fit_predict(X)
# 中心点
center = K.cluster_centers_
print(center)
# 分类结果
label=K.labels_
print(label)
轮廓系数
# 下面这一系列过程完成了分别求出分3类到15类情况下轮廓系数的大小(最大的为最佳方案)
coef = []
x = range(3, 15)
for clusters in x:
print(clusters)
clusterid, error, nfound = kcluster(X, clusters, dist='u', npass=100)
silhouette_avg = silhouette_score(X, clusterid, metric='cosine')
coef.append(silhouette_avg)
e = [i + 3 for i, j in enumerate(coef) if j == max(coef)]
print(e)
print(coef)