K-centerクラスタリングアルゴリズムを実装するためのPython非チューニングパッケージ

K-centerクラスタリングアルゴリズムを実装するためのPython非チューニングパッケージ


序文

ようやく一学期を終え、落ち着いて興味のある分野を学び、ブログを書いて自分の学習経験を記録する時間がありました。
クラスタリングは機械学習の古典的なタイプのアルゴリズムです。Kmeansアルゴリズムは広く知られていますが、K-centerがそれを聞いたことはほとんどなく、ほとんどの機械学習の本で言及されることはめったにありません。
今日は、K-centerクラスタリングアルゴリズムについて説明しましょう。

1. K-centerクラスタリングアルゴリズムとは何ですか?

1.K中心点クラスタリングアルゴリズムの基本的な考え方は次のとおりです:

K-centerポイントクラスタリングアルゴリズムの場合、最初の代表的なオブジェクト(またはシード)が最初にランダムに選択されます。代表的なオブジェクトは中心点とも呼ばれ、他のオブジェクトは非代表的なオブジェクトと呼ばれます。
最初に、k個のオブジェクトが中心点としてランダムに選択されます。アルゴリズムは、代表的なオブジェクトを代表的でないオブジェクトに繰り返し置き換え、クラスタリングの品質を向上させるためにより良い中心点を見つけようとします。

2. K-centerクラスタリングとKmeansの主な違い:

クラスタリング中心の差を初期化します。Kmeansはサンプル空間内のランダムな座標点を中心として選択します。これらの点は必ずしもサンプル点オブジェクトを表すとは限りません。Kcenterはサンプル点オブジェクトをクラスター中心として選択します。
距離計算式For上記の違いは、Kmeansは通常ユークリッド距離を使用し、K中心はマンハッタン距離を使用します。
クラスター中心更新するために、Kmeansはクラスター内のサンプル点を平均化する方法を使用して中心を更新し、K中心は最初に中心点と非中心点を生成します。組み合わせてから、新しい中心を決定する前に、コスト関数が最小の組み合わせを見つけます。

3. K-center pointクラスタリングアルゴリズムプロセスの説明:

入力:クラスターの数kとn個のオブジェクトを含むデータベース
出力:k個のクラスター、すべてのオブジェクトとそれらの最も近い中心点の間の非類似度の合計が最小になるように
(1)初期クラスター中心点としてk個のオブジェクトを任意に選択します
( 2)繰り返し
(3)最も近い中心点で表されるクラスターに残りの各オブジェクトを割り当てます
(4)繰り返し
(5)選択されていない中心点を選択します
(6)繰り返し
(7)選択されていない非中心点オブジェクトを選択しますOrandom
(8) OiをOrandomに置き換える総コストを計算し、Sに記録します
(9)すべての非中心点が選択される
まで(10)すべての中心点が選択されるまで
(11)Sの場合すべての非中心点が置き換えられた後すべての中心点で、総コストは0未満と計算されます。次に、中心点を非中心点に置き換えた後、コストが最も低いSの値を見つけ、対応する中心点を非中心点に置き換えます。 、k個の中心点の新しいセットを形成する;
(12)クラスターの再分布が再び発生しなくなるまで、つまり、すべてのSが0より大きいまで

4.例

空間に5つのポイント{ABCDE}がある場合、ポイント間の距離関係が表に示され、与えられたデータに従ってK中心点アルゴリズムが実行されてクラスタリングが実現されます(K = 2に設定)。
ここに画像の説明を挿入します
(1)まず、中心をランダムに選択します。{AB}を例にとると、クラスターは{ACD}と{BE}に分割されます。実際には、クラスターを分割する方法はたくさんあります。これは、均等に分割するためだけのものです。 、そして答えはユニークではありません。
(2)ABを中心としたコスト関数Cost(AB)= d(AC)+ d(AD)+ d(BE)= 2 + 2 + 3 = 7を計算します。ここでコスト関数について言及する必要があります。多くの定義。K中心の目的は、クラスター内の他の点からの距離の合計が最小の点を新しい中心として見つけることです。
(3)中心{AB}と非中心{CDE}を組み合わせてコストを取得します。中心点のセット{AC、AD、AE、BC、BD、BE}を使用して、これらの中心グループのコスト関数を1つずつ見つけ、元の中心コスト関数を減算します。最小値は新しい中心です。例:Cost(AC)= d(AB)+ d(AE)+ d(CD)= 5、Cost(AC)-Cost(AB)=-2。この特別な質問のために、多くの新しいセンターが存在する可能性があります。
(4)コスト差が減少しなくなるまで、上記の手順を実行し続けます。
PS:理解できない場合は、K-Medoideクラスタリングアルゴリズム(K-Medoide)を参照することもできます。

第二に、コードの実装

import random
import numpy as np

class Kmedoid:
    def __init__(self, data, k):
    """
    data:训练数据,矩阵形式
    k:聚类个数
    """
        self.data = data
        self.k = k

    def randCent(self):  # 随机选取一个点
        random_index = random.randint(0, self.data.shape[0]-1)
        return random_index, self.data[random_index, :]

    def distance(self, vecA, vecB):  # 计算曼哈顿距离
        return sum(abs(vecA - vecB))

    def run(self):
        init_centers = []  # 初始化中心的列表
        init_indexs = []  # 被选中作为中心的点的下标
        while len(init_centers) < self.k:
            index, center = self.randCent()
            if index not in init_indexs:  # 保证选点不重复
                init_centers.append(center)
                init_indexs.append(index)
            else:
                continue

        while True:
            cluster_category = []  # 记录聚类结果
            for i in range(self.data.shape[0]):  # 遍历每一个点
                minv = np.inf  # 最小距离,初始为正无穷
                cluster_index = 0  # 所属簇的下标
                for index, center in enumerate(init_centers):  # 遍历每个中心
                    # 选取离得最近的中心作为归属簇
                    dist = self.distance(center, self.data[i, :])
                    if dist < minv:
                        minv = dist
                        cluster_index = index
                cluster_category.append(cluster_index)

            # 重新计算中心点
            new_indexs = [0 for i in range(len(init_centers))]  # 更新被选中作为中心的点的下标
            min_dists = [np.inf for i in range(len(init_centers))]  # 中心点对应最小距离
            for i in range(self.data.shape[0]):
                min_dist = 0  # 求与当前簇其他点的距离之和
                for j in range(self.data.shape[0]):  # 遍历每一个点
                    if cluster_category[i] == cluster_category[j]:  # 属于同一个簇才进行累加
                        min_dist += self.distance(self.data[i, :], self.data[j, :])
                if min_dist < min_dists[cluster_category[i]]:  # 保存数据到列表
                    min_dists[cluster_category[i]] = min_dist
                    new_indexs[cluster_category[i]] = i

            init_centers = []  # 新的聚类中心
            for index in new_indexs:
                init_centers.append(self.data[index, :])

            if new_indexs == init_indexs:  # 如果新的中心与上次相同则结束循环
                return cluster_category, init_centers
            else:
                init_indexs = new_indexs  # 更新聚类中心下标

総括する

機械学習アルゴリズムを学習するには、その原理を習得することを学ぶ必要があります。サードパーティのライブラリを使用してパッケージを調整するのではなく、基本ライブラリを使用して自分で実装するのが最善です。機械学習は、深層学習と強化学習。しっかりと山を振らないでください。皆さんが幸せな冬の休暇を過ごせることを願っています。

おすすめ

転載: blog.csdn.net/weixin_43594279/article/details/112978464