K 平均法クラスタリング アルゴリズム (Python3 実装コードを使用)

この記事のコードとデータのアドレスは github にアップロードされています: https://github.com/helloWorldchn/MachineLearning

1. K-meansアルゴリズムの基本的な考え方

1. パーティションベースのクラスタリング

パーティション アルゴリズムの考え方は、マイニングする特定のデータ セット内のデータ オブジェクトを K グループ (k≤N、N はデータ セット内のオブジェクトの数を表します) に分割し、各グループがクラスターを表すことです。また、どのデータ オブジェクトも 1 つのクラスターにのみ属することができ、各クラスターには少なくとも 1 つのデータ オブジェクトがあることが満たされなければなりません。
このアルゴリズムでは通常、アルゴリズムを開始する前に、クラスタリング後のクラスターの数を決定するためにパラメーター K を指定する必要があります。このアルゴリズムは、パラメーター k に従って初期グループ化を確立し、反復再配置手法を繰り返し使用して各クラスター内のデータ オブジェクトを再分散し、最終的に比較的満足のいくクラスタリング結果を取得します。クラスター内のデータ オブジェクト間のギャップができるだけ小さく、クラスター間のデータ オブジェクト間のギャップができるだけ大きい場合、優れたクラスタリング分析アルゴリズムと言えます。K-medoid アルゴリズムと K-means アルゴリズムは、分割アルゴリズムの 2 つの古典的なアルゴリズムです。他の多くの分割アルゴリズムは、これら 2 つのアルゴリズムから進化および改良されています。

2. K 平均法の概要

1957 年に Lloyd が初めて K 平均法アルゴリズムを文献で提案し、1967 年に MacQueen が古典的な K 平均法アルゴリズムを文献で示し、K 平均法アルゴリズムの完全な理論を説明し、詳細な研究を実施しました。最も古典的な分割クラスタリング アルゴリズムとして、k 平均法アルゴリズムの実装は複雑ではなく、拡張性が高く、同時に信頼性と効率性も高く、広く使用されているクラスタリング アルゴリズムです。

3. K 平均法アルゴリズムのプロセス

K 平均法 (K 平均法) アルゴリズムは、パラメーター K を受け入れて、結果内のクラスターの数を決定します。アルゴリズムの開始時に、k 個のデータ オブジェクトがデータ セット内でランダムに選択されて k 個のクラスターの初期中心として使用され、残りのデータ オブジェクトはそれらと各クラスターのクラスター中心との間の距離に応じて選択されます。それに。次に、各クラスター内のすべてのデータ オブジェクトの平均値を再計算し、得られた結果を新しいクラスターの中心として使用し、目的関数が収束するまで上記のプロセスを段階的に繰り返します。

アルゴリズムの具体的な手順を以下に説明します。

  1. 指定されたデータセットに対して、K 個のクラスター中心 (クラスター中心) をランダムに初期化します。
  2. 各データからクラスターの中心までの距離を計算し (通常はユークリッド距離を使用)、データを最も近いクラスターとして分類します。
  3. 取得したクラスターに基づいてクラスターの中心を再計算します。
  4. クラスターの中心が変化しなくなるまで、または指定したしきい値より小さくなるまで、ステップ 2 とステップ 3 を繰り返します。
    K 平均法アルゴリズムのフローチャート
    K 平均法アルゴリズムのフローチャート

4. K 平均法擬似コード

输入 n 个数据对象集合Xi ;输出 k 个聚类中心 Zj 及K 个聚类数据对象集合 Cj .
Procedure K -means(s , k)
S ={
    
    x 1 ,x 2 ,,x n };
m =1;for j =1 to k 初始化聚类中心 Zj ;
do {
    
    for i =1 to n
  for j=1 to k
   {
    
    D(Xi ,Zj)= Xi -Zj ;if D(Xi ,Zj)=Min{
    
    D(Xi ,Zj)}then Xi ∈Cj ;}//归类
   if m=1 then Jc(m)=∑kj=1∑ Xi -Zj
2
  m =m+1;for j =1 to k
  Zj =(∑
n
i=1 (Xi)
j )/n;//重置聚类中心
  }while J c (m)-J c (m -1) >ξ

2. K 平均法コードの実装

この記事で使用するデータ セットは UCI データ セットであり、テストにはアイリス データ セット Iris、ワイン データ セット Wine、小麦種子データ セット シードを使用します。この論文では、これら 3 つのデータ セットを UCI 公式 Web サイトからダウンロードします。そしてそれらを同じフォルダー内の Python ファイルに置きます。同時に、プログラムの必要性により、データセットの列の位置がわずかに変更されました。データセットの具体的な情報は次のとおりです。

データセット サンプル数 属性次元 カテゴリの数
虹彩 150 4 3
ワイン 178 3 3
種子 210 7 3

データセットは私のホームページのリソースから入手できます。ポイントは無料でダウンロードできます。ダウンロードできない場合は、私にプライベートメッセージを送ってください。

1. Python3 コードの実装

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import f1_score, accuracy_score, normalized_mutual_info_score, rand_score
from sklearn.preprocessing import LabelEncoder
from sklearn.decomposition import PCA


# 数据保存在.csv文件中
iris = pd.read_csv("dataset/Iris.csv", header=0)  # 鸢尾花数据集 Iris  class=3
wine = pd.read_csv("dataset/wine.csv")  # 葡萄酒数据集 Wine  class=3
seeds = pd.read_csv("dataset/seeds.csv")  # 小麦种子数据集 seeds  class=3
wdbc = pd.read_csv("dataset/wdbc.csv")  # 威斯康星州乳腺癌数据集 Breast Cancer Wisconsin (Diagnostic)  class=2
glass = pd.read_csv("dataset/glass.csv")  # 玻璃辨识数据集 Glass Identification  class=6
df = iris  # 设置要读取的数据集
# print(df)

columns = list(df.columns)  # 获取数据集的第一行,第一行通常为特征名,所以先取出
features = columns[:len(columns) - 1]  # 数据集的特征名(去除了最后一列,因为最后一列存放的是标签,不是数据)
dataset = df[features]  # 预处理之后的数据,去除掉了第一行的数据(因为其为特征名,如果数据第一行不是特征名,可跳过这一步)
attributes = len(df.columns) - 1  # 属性数量(数据集维度)
class_labels = list(df[columns[-1]])  # 原始标签

k = 3

# 这里已经知道了分3类,其他分类这里的参数需要调试
model = KMeans(n_clusters=k)
# 训练模型
model.fit(dataset)
# 预测全部数据
label = model.predict(dataset)
print(label)


def clustering_indicators(labels_true, labels_pred):
    if type(labels_true[0]) != int:
        labels_true = LabelEncoder().fit_transform(df[columns[len(columns) - 1]])  # 如果数据集的标签为文本类型,把文本标签转换为数字标签
    f_measure = f1_score(labels_true, labels_pred, average='macro')  # F值
    accuracy = accuracy_score(labels_true, labels_pred)  # ACC
    normalized_mutual_information = normalized_mutual_info_score(labels_true, labels_pred)  # NMI
    rand_index = rand_score(labels_true, labels_pred)  # RI
    return f_measure, accuracy, normalized_mutual_information, rand_index


F_measure, ACC, NMI, RI = clustering_indicators(class_labels, label)
print("F_measure:", F_measure, "ACC:", ACC, "NMI", NMI, "RI", RI)

if attributes > 2:
    dataset = PCA(n_components=2).fit_transform(dataset)  # 如果属性数量大于2,降维
# 打印出聚类散点图
plt.scatter(dataset[:, 0], dataset[:, 1], marker='o', c='black', s=7)  # 原图
plt.show()
colors = np.array(["red", "blue", "green", "orange", "purple", "cyan", "magenta", "beige", "hotpink", "#88c999"])
# 循换打印k个簇,每个簇使用不同的颜色
for i in range(k):
    plt.scatter(dataset[np.nonzero(label == i), 0], dataset[np.nonzero(label == i), 1], c=colors[i], s=7)
plt.show()

2. クラスタリング結果の分析

本稿では、評価指標としてF値(F-measure、FM)、精度率(Accuracy、ACC)、標準相互情報量(NMI)、ランド指数(Rand Index、RI)を選定し、その値を算出する。範囲は [ 0,1] で、値が大きいほど、クラスタリング結果が期待どおりになります。

F 値は、適合率 (Precision) と再現率 (Recall) の 2 つの指標を組み合わせたもので、適合率と再現率の調和平均値であり、計算式は次の式で示されます。

精度 = TPTP + FP 精度 =\frac{TP}{TP+FP}精度_ _ _ _ _ _=TP+FPTP

リコール = TPTP + FN リコール =\frac{TP}{TP+FN}全て記録する=TP+FNTP

F − 測定値 = 2 再現率 × 精度 再現率 + 精度 F-measure=\frac{2Recall \times Precision}{Recall+Precision}F確か_ _ _ _=全て記録する+精度_ _ _ _ _ _2録音する_ _×精度_ _ _ _ _ _

ACC は、データセット内のサンプルの総数に対する正しく分類されたサンプルの数の比率であり、計算式は次のとおりです。

ACC = TP + TNTP + TN + FP + FN ACC=\frac{TP+TN}{TP+TN+FP+FN}CC _=TP+テネシー州+FP+FNTP+TN

このうち、TP(True Positive)は陽性クラスを予測するサンプル数を陽性クラス数として示し、TN(True Negative)は陰性クラスを予測するサンプル数を陰性クラス数として示し、FP( False Positive)は、陰性クラスが予測されることを示します。FN(False Negative)は、陽性クラスを予測するサンプル数を陰性クラスの数として表します。

NMIは、クラスタリング結果と既知のカテゴリラベルの一致度を定量化するために使用され、ACCと比較して、NMIの値はカテゴリラベルの配置に影響されません。次のように計算されます。

NMI = I ( U , V ) H ( U ) H ( V ) NMI=\frac{I\left(U,V\right)}{\sqrt{H\left(U\right)H\left(V\右)}}ニューメキシコ州I=H()H( V ) (V )

このうち、H(U) は正しい分類のエントロピーを表し、H(V) はアルゴリズムによって得られた結果のエントロピーを表します。

具体的な実装コードは以下の通りです。
データセットに与えられた正しいラベルがデジタルラベルではなくテキストタイプの場合があるため、データセットのラベルがデジタルタイプであるかどうかを計算前に判断する必要があり、そうでない場合は計算する必要があります。 、デジタルタイプに変換します

def clustering_indicators(labels_true, labels_pred):
    if type(labels_true[0]) != int:
        labels_true = LabelEncoder().fit_transform(df[columns[len(columns) - 1]])  # 如果数据集的标签为文本类型,把文本标签转换为数字标签
    f_measure = f1_score(labels_true, labels_pred, average='macro')  # F值
    accuracy = accuracy_score(labels_true, labels_pred)  # ACC
    normalized_mutual_information = normalized_mutual_info_score(labels_true, labels_pred)  # NMI
    rand_index = rand_score(labels_true, labels_pred)  # RI
    return f_measure, accuracy, normalized_mutual_information, rand_index


F_measure, ACC, NMI, RI = clustering_indicators(class_labels, label)
print("F_measure:", F_measure, "ACC:", ACC, "NMI", NMI, "RI", RI)

クラスター分析インデックスを計算する必要がある場合は、上記のコードを K 平均法実装コードに挿入するだけです。

3. クラスタリング結果

  1. アイリス データセット アイリス
    Iris アヤメ データセットの元の画像

    Iris アヤメ データセットの元の画像
    アヤメアヤメデータセットの K-means クラスタリングレンダリング
    アヤメアヤメデータセットの K-means クラスタリングレンダリング

  2. ワイン データセット ワイン
    ワイン wine データセットの元の画像

    ワイン wine データセットの元の画像
    Wine ワイン データ セットの K-means クラスタリング レンダリング
    Wine ワイン データ セットの K-means クラスタリング レンダリング

  3. 小麦種子データセット
    Seeds 小麦種子データセットの元の画像

    Seeds 小麦種子データセットの元の画像
    ここに画像の説明を挿入
    種子 小麦種子データセット K 平均法クラスタリング効果図

4. K-means アルゴリズムの不十分さ

K 平均法アルゴリズムの中核となるステップは、クラスター内の最小距離を達成するために、継続的な反復を通じてクラスターの中心を更新することです。このアルゴリズムの時間計算量は非常に低いため、このアルゴリズムは広く使用されていますが、アルゴリズムには多くの欠点があり、主な欠点は次のとおりです。

  1. K-means クラスタリングのクラスターの数はユーザーが指定する必要があります。K 平均法アルゴリズムでは、まずユーザーがクラスター数の K 値を指定する必要があります。K 値の決定は、クラスタリングの結果に直接影響します。通常、K 値はユーザーが自身の経験と経験に基づいて指定する必要があります。データセットを理解していないため、指定された値が理想的ではない可能性があります。クラスタリングの結果は保証されません。
  2. K 平均法アルゴリズムの最初の中心点の選択はランダムな方法です。K 平均法アルゴリズムは、初期中心点の選択に大きく依存します。初期中心点が誤って選択されると、その後のクラスタリング プロセスに大きな影響を及ぼし、最適なクラスタリング結果が得られなくなる可能性があります。が得られ、クラスタリングの反復回数も減少します。増加する可能性があります。最初の中心点のランダムな選択には大きな不確実性があり、クラスタリングの効果に直接影響します。
  3. K 平均法は類似性の測定にユークリッド距離を使用するため、非凸データセットで良好なクラスタリング効果を達成するのは困難です。

おすすめ

転載: blog.csdn.net/qq_43647936/article/details/130246537