K-means クラスタリングの概要

1。概要

「教師なし学習」としても知られるクラスタリング アルゴリズムは、データを意味のあるまたは有用なグループ (またはクラスター) に分割することを目的としています。
画像の説明を追加してください

2.K 平均

重要な概念: クラスターとセントロイド
KMeans アルゴリズムは、N 個のサンプルのセットの特徴行列 X を、交差のない K 個のクラスターに分割します。直感的には、クラスターは、一緒に集められたデータのグループです。クラスター内のデータは、同じクラス。クラスターはクラスター化の結果です。
クラスター内のすべてのデータの平均は、クラスターの「重心」と呼ばれることがよくあります。2 次元平面では、データ ポイントのクラスターの重心の横座標はデータ ポイントのクラスターの横座標の平均であり、重心の縦座標はデータ ポイントのクラスターの縦座標の平均です。同じ原理を高
次元空間にも拡張できます。

3. クラスター内の誤差二乗和の定義と解法

同じクラスタに分類されたデータは似ていると考えられますが、異なるクラスタのデータは異なるため、「グループ内では小さな差、グループ間では大きな差」を追求します。クラスタリングアルゴリズムも同様の目的で、「クラスタ内の小さな差異とクラスタの外の大きな差異」を追求します。そして、この「差」は、サンプル点からそのクラスターの重心までの距離によって測定されます。クラスターの場合、すべてのサンプル ポイントから重心までの距離の合計が小さいほど、このクラスター内のサンプルは類似し、クラスター内の差異は小さくなります。
画像の説明を追加してください
n は各サンプルの特徴の数を表し、x はサンプルを表し、miu はクラスター内の重心を表します。
画像の説明を追加してください
このうち、m はクラスタ内のサンプル数、j は各サンプルの番号です。この式はクラスター二乗和 (クラスター二乗和) と呼ばれ、慣性としても知られています。
総平方和 (総クラスター平方和) は、総慣性とも呼ばれ、データ セット内のすべてのクラスターのクラスター内平方和を加算することによって取得されます。合計慣性が小さいほど、各クラスター内のサンプルが類似し、クラスター化効果が高くなります。したがって、KMeans が追求するのは、慣性を最小化できる重心を解決することです。

4.sklearn.cluster.KMeans

4.1 重要なパラメータ n_clusters

n_clusters は KMeans の k であり、分割するカテゴリの数をモデルに指示することを意味します。これは KMeans の唯一の必須パラメータです。デフォルトは 8 カテゴリですが、通常、クラスタリングの結果は 8 未満の結果になります。
単純なクラスタリング

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

#首先简单的进行一次聚类
'''
步骤如下:
1。首先使用sklearn中的方法来自定义自己的数据
2。画出散点图,顺带画出已经分好簇的散点图,使用plot,同时也对原始的数据已经分好簇的数据进行画图描述使用四种颜色
3。基于这个分布,使用kmeans来进行聚类,需要导入聚类中的kmeans
    设置要分好的类别,然后对其进行拟合,预测的结果使用label可以看到预测出来的结果.
    使用sluster_centers_可以输出每一个簇的分类点的位置
    使用inertia_可以查看总的欧氏距离是多少
4。分别猜测其中有3456四个簇,通过簇内平方和来判断哪一个数目是最好的。
'''

#自己创建数据集,生成的数据大小是500*2500个数据,每一个数据有两个特征,分别对应的是x1,x2
X,Y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)


fig,ax1 = plt.subplots(1)
ax1.scatter(
    X[:,0],
    X[:,1],
    marker = 'o',
    s=8
)
color = ['red','pink','orange','gray']
# fig,ax2 = plt.subplots(1)
# for i in range(4):
#     ax2.scatter(
#         X[Y==i,0],
#         X[Y==i,1],
#         s=8,
#         c=color[i]
#     )
plt.show()

from sklearn.cluster import KMeans
n_clusters = 3
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 4
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 5
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
n_clusters = 6
cluster = KMeans(n_clusters=n_clusters,random_state=0).fit(X)
y_pred = cluster.labels_#聚类之后分好的类别。
print(y_pred)
pre = cluster.fit_predict(X)
#print(pre == y_pred)
inertia = cluster.inertia_
centroid = cluster.cluster_centers_
print(inertia)
color = ['red','pink','orange','gray','green','yellow']
fig , ax3 = plt.subplots()

for i in range(n_clusters):
    ax3.scatter(X[y_pred==i,0],X[y_pred==i,1]
                ,marker='o'
                ,s=8
                ,c=color[i]
                )
ax3.scatter(centroid[:,0]
            ,centroid[:,1]
            ,marker='x'
            ,s=15
            ,c='black')
plt.show()

4.2 クラスタリングアルゴリズムのモデル評価指標

分類モデルや回帰とは異なり、クラスタリング アルゴリズムのモデル評価は単純な問題ではありません。
1. 分類では直接的な結果(ラベル)出力があり、分類結果は正誤に分かれるため、予測精度、混同行列、ROC曲線などの指標を用いて評価しますが、どのように評価しても評価するのは、正しい答えを見つけるモデルの能力です。
2. 回帰では、データを適合させる必要があるため、モデルの適合度を測定するための SSE 平均二乗誤差と損失関数があります。ただし、これらのメトリクスはいずれもクラスタリングには使用できません。

4.3.1 真のラベルがわかっている場合

実際のラベルがある場合は、分類アルゴリズムを使用することを好みます。しかし、クラスタリング アルゴリズムが引き続き使用される可能性が排除されるわけではありません。サンプルの実際のクラスタリング状況のデータがあれば、クラスタリング アルゴリズムの結果と実際の結果に対するクラスタリングの影響を測定できます。以下の 3 つの方法が一般的に使用されます:
相互情報スコア: 値の範囲が (0,1) の 1 に近いほど、クラスタリングの効果が高くなります。 ランダムな一様クラスタリングでは 0 点が生成されます。 V 測定: 値の範囲
はin (0,1) の中で 1 に近いほど、1 に近いほどクラスタリング効果が高くなります。
Rand 係数を調整します: 値の範囲が (0,1) の中で 1 に近づくほど、1 に近づくほど良くなります。

4.3.2 真のラベルが不明な場合:シルエット係数

その中でも、クラスタリングアルゴリズムの評価指標として最もよく使われるのがシルエット係数です。これはサンプルごとに定義され、次のことを同時に測定できます。
1) サンプルとそのクラスター内の他のサンプルとの類似度 a (サンプルと同じクラスター内の他のすべての点の間の平均距離に等しい
)サンプルと他のクラスター内のサンプルの類似度 b は、サンプルと次に近いクラスター内のすべての点の間の平均距離に等しい。
クラスタリングの要件によれば、「クラスター内の差異は小さく、差異は小さい」クラスターの外側は大きい」という場合、 b が常に a より大きく、大きいほど良いと考えられます。
画像の説明を追加してください
シルエット係数の範囲は (-1,1) であり、値が 1 に近づくほど、サンプルはそのクラスター内のサンプルに非常によく似ており、クラスター内のサンプルとは似ていないことが容易に理解できます。サンプル点がクラスター外のサンプルと類似している場合、より類似している場合、シルエット係数は負になります。シルエット係数が 0 の場合、2 つのクラスター内のサンプルの類似性が同じであることを意味し、2 つのクラスターは 1 つのクラスターである必要があります。シルエット係数が 1 に近いほど良好であると結論付けることができ、負の数値はクラスタリング効果が非常に低いことを示します。

クラスター内のほとんどのサンプルのシルエット係数が比較的高い場合、クラスター全体のシルエット係数はより高く、データセット全体の平均シルエット係数が高いほど、クラスター化は適切です。多くのサンプル点のシルエット係数が低いか負の値さえある場合、クラスタリングは不適切であり、クラスタリングのハイパーパラメータ K の設定が大きすぎるか小さすぎる可能性があります。

4.3.3 実際のラベルが不明な場合: Calinski-Harabaz Index

最も一般的に使用されるシルエット係数に加えて、Calinski-Harabaz 指数 (略して CHI、分散比標準とも呼ばれます)、Davies-Bouldin 指数 (Davies-Bouldin)、および分割行列 (Contingency) もあります。マトリックス)を使用できます。

ここでは、カリンスケ・ハラバス指数の理解に焦点を当てます。カリンスキー・ハラバズ指数が高いほど良いことになります。k 個のクラスターを含むクラスターの場合、Calinski-Harabaz インデックス s(k) は次のように記述されます。
画像の説明を追加してください

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from sklearn.datasets import make_blobs
n_clusters = 5
X,Y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(18, 7)#是用来设置生成图片大小的
ax1.set_xlim([-0.1, 1])#设置x坐标轴的
ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
cluster_labels = clusterer.labels_#分出来的类别
silhouette_avg = silhouette_score(X, cluster_labels)
print("For n_clusters =", n_clusters,"The average silhouette_score is :", silhouette_avg)
sample_silhouette_values = silhouette_samples(X, cluster_labels)
y_lower = 10
for i in range(n_clusters):
    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
    ith_cluster_silhouette_values.sort()#这里是为了能够从小到大向上排列
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i#这里是留出来上下的空间
    color = cm.nipy_spectral(float(i)/n_clusters)#设置颜色使用的。
    '''
    进行颜色的填充。只不过是填充的方向不同。
fill_between是进行y轴方向上的填充,也就是竖直方向的填充
fill_betweenx是进行x轴方向上的填充,也就是水平方向的填充
    '''
    # 第一个参数是范围
    # 第二个参数表示填充的上界
    # 第三个参数表示填充的下界,默认0
    ax1.fill_betweenx(np.arange(y_lower, y_upper),ith_cluster_silhouette_values,facecolor=color,alpha=0.7)#进行颜色填充的
    ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))#精准的在图上的某一个点位进行写字。前面两个是坐标信息,后面是内容。
    y_lower = y_upper + 10
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel("Cluster label")
ax1.axvline(x=silhouette_avg, color="red", linestyle="--")#ax1.axvline设置一条中轴线。所有样本的轮廓系数。
ax1.set_yticks([])
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
ax2.scatter(X[:, 0], X[:, 1] ,marker='o',s=8,c=colors )
centers = clusterer.cluster_centers_
# Draw white circles at cluster centers在簇中画出来质心
ax2.scatter(centers[:, 0], centers[:, 1], marker='x',
c="red", alpha=1, s=200)
ax2.set_title("The visualization of the clustered data.")
ax2.set_xlabel("Feature space for the 1st feature")
ax2.set_ylabel("Feature space for the 2nd feature")
plt.suptitle(("Silhouette analysis for KMeans clustering on sample data ""with n_clusters = %d" % n_clusters), fontsize=14, fontweight='bold')
plt.show()

4.3 重要なパラメータ init、random_state、n_init: 初期重心をどのように配置するか?

K 平均法の重要なリンクは、初期重心を配置することです。十分な時間があれば、K 平均法は確実に収束しますが、慣性は極小値に収束する可能性があります。真の最小値に収束できるかどうかは、重心の初期化に大きく依存します。init は、初期化方法を決定するために使用されるパラメータです。

init: 「k-means++」、「ランダム」、または n 次元配列を入力できます。これは重心を初期化する方法です。デフォルトは「k-means++」です。「kmeans++」と入力します。これは、収束を高速化するために K 平均法クラスタリングの初期クラスター中心を選択する賢い方法です。
random_state: 各重心ランダム初期化の乱数シードを制御します。
n_init: 整数、デフォルトは 10、異なる重心ランダム初期化シードで K 平均法アルゴリズムを実行する回数。

4.4 重要なパラメータ max_iter と tol: 反復を停止します

重心が移動しなくなると、Kmeans アルゴリズムは停止します。ただし、完全に収束する前に、反復を早期に停止するために、max_iter (反復の最大数)、または tol (2 つの反復間の慣​​性ドロップの量) を使用することもできます。これら 2 つのパラメーターは次のとおりです。

max_iter: 整数、デフォルト 300、1 回の実行における K 平均法アルゴリズムの最大反復数
tol: 浮動小数点数、デフォルト 1e-4、2 つの反復間で慣性の値が低下した場合の、2 つの反復間の慣​​性低下の量反復回数が tol 設定値未満である場合、反復は
停止します

random = KMeans(n_clusters = 10,init="random",max_iter=10,random_state=420).fit(X)
y_pred_max10 = random.labels_
silhouette_score(X,y_pred_max10)
random = KMeans(n_clusters = 10,init="random",max_iter=20,random_state=420).fit(X)
y_pred_max20 = random.labels_
silhouette_score(X,y_pred_max20)

5. 次元削減のためのクラスタリングアルゴリズム、KMeans のベクトル量子化アプリケーション

おすすめ

転載: blog.csdn.net/guoguozgw/article/details/129240604#comments_25380299