ホームページ  >  記事  >  バックエンド開発  >  Pythonでキャノピークラスタリングを実装する方法

Pythonでキャノピークラスタリングを実装する方法

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-06-24 18:04:354197ブラウズ

Canopy アルゴリズムは、2000 年に Andrew McCallum、Kamal Nigam、Lyle Ungar によって提案されました。これは、K 平均法クラスタリング アルゴリズムと階層的クラスタリング アルゴリズムの前処理です。ご存知のとおり、kmeans の欠点の 1 つは、k 値を手動で調整する必要があることです。k 値は、後からエルボー法とシルエット係数を通じて最終的に決定できますが、これらの方法は「事後」に判断されます。 , そして、Canopy アルゴリズムの役割は、事前に大まかなクラスタリングを通じて、k-means アルゴリズムのクラスター中心とクラスター中心点の初期数を決定することです。

Pythonでキャノピークラスタリングを実装する方法

使用したパッケージ:

import math
import random
import numpy as np
from datetime import datetime
from pprint import pprint as p
import matplotlib.pyplot as plt

1. まず、アルゴリズムに 2 次元のものをプリセットします (便利のため)後の 2 次元平面上での描画とプレゼンテーション用) データ データセット。

もちろん、高次元のデータも使用できますので、キャノピー コア アルゴリズムをクラスに記述しました。後は、任意の次元のデータを直接呼び出しで処理できます。バッチ。大量のデータ バッチを Mahout および Hadoop に移動できます。

# 随机生成500个二维[0,1)平面点
dataset = np.random.rand(500, 2)

関連する推奨事項:「Python ビデオ チュートリアル

2. 次に、2 つのカテゴリを生成します。クラスの属性は次のとおりです。

class Canopy:
    def __init__(self, dataset):        
        self.dataset = dataset        
        self.t1 = 0
      self.t2 = 0

t1とt2の初期値を設定し、サイズを決定する関数を追加します

   # 设置初始阈值  
def setThreshold(self, t1, t2):        
    if t1 > t2:
        self.t1 = t1            
        self.t2 = t2        
    else:
        print('t1 needs to be larger than t2!')

3. 距離計算、各中心点間の距離計算方法はユークリッド距離です私が使う。

#使用欧式距离进行距离的计算
def euclideanDistance(self, vec1, vec2):        
    return math.sqrt(((vec1 - vec2)**2).sum())

4. 次に、データセットの長さに応じてデータセットから添字をランダムに選択する関数を作成します

# 根据当前dataset的长度随机选择一个下标 
def getRandIndex(self):        
    return random.randint(0, len(self.dataset) - 1)

5. コア アルゴリズム

def clustering(self):        
        if self.t1 == 0:
            print('Please set the threshold.')        
        else:
            canopies = []  # 用于存放最终归类结果
            while len(self.dataset) != 0:
                rand_index = self.getRandIndex()
                current_center = self.dataset[rand_index]  # 随机获取一个中心点,定为P点
                current_center_list = []  # 初始化P点的canopy类容器
                delete_list = []  # 初始化P点的删除容器
                self.dataset = np.delete(                    
                     self.dataset, rand_index, 0)  # 删除随机选择的中心点P
                for datum_j in range(len(self.dataset)):
                    datum = self.dataset[datum_j]
                    distance = self.euclideanDistance(
                        current_center, datum)  # 计算选取的中心点P到每个点之间的距离
                    if distance < self.t1:
                        # 若距离小于t1,则将点归入P点的canopy类
                        current_center_list.append(datum)                    
                    if distance < self.t2:
                        delete_list.append(datum_j)  # 若小于t2则归入删除容器
                # 根据删除容器的下标,将元素从数据集中删除
                self.dataset = np.delete(self.dataset, delete_list, 0)
                canopies.append((current_center, current_center_list))        
          return canopies

後続のデータ視覚化を容易にするために、ここで定義するキャノピーは配列ですが、もちろん dict も使用できます。
6.main() 関数

def main():
    t1 = 0.6
    t2 = 0.4
    gc = Canopy(dataset)
    gc.setThreshold(t1, t2)
    canopies = gc.clustering()
    print(&#39;Get %s initial centers.&#39; % len(canopies))    
    #showCanopy(canopies, dataset, t1, t2)

キャノピー クラスタリング視覚化コード

def showCanopy(canopies, dataset, t1, t2):
    fig = plt.figure()
    sc = fig.add_subplot(111)
    colors = [&#39;brown&#39;, &#39;green&#39;, &#39;blue&#39;, &#39;y&#39;, &#39;r&#39;, &#39;tan&#39;, &#39;dodgerblue&#39;, &#39;deeppink&#39;, &#39;orangered&#39;, &#39;peru&#39;, &#39;blue&#39;, &#39;y&#39;, &#39;r&#39;,              &#39;gold&#39;, &#39;dimgray&#39;, &#39;darkorange&#39;, &#39;peru&#39;, &#39;blue&#39;, &#39;y&#39;, &#39;r&#39;, &#39;cyan&#39;, &#39;tan&#39;, &#39;orchid&#39;, &#39;peru&#39;, &#39;blue&#39;, &#39;y&#39;, &#39;r&#39;, &#39;sienna&#39;]
    markers = [&#39;*&#39;, &#39;h&#39;, &#39;H&#39;, &#39;+&#39;, &#39;o&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;,&#39;, &#39;v&#39;, &#39;H&#39;, &#39;+&#39;, &#39;1&#39;, &#39;2&#39;, &#39;^&#39;,               &#39;<&#39;, &#39;>&#39;, &#39;.&#39;, &#39;4&#39;, &#39;H&#39;, &#39;+&#39;, &#39;1&#39;, &#39;2&#39;, &#39;s&#39;, &#39;p&#39;, &#39;x&#39;, &#39;D&#39;, &#39;d&#39;, &#39;|&#39;, &#39;_&#39;]    for i in range(len(canopies)):
        canopy = canopies[i]
        center = canopy[0]
        components = canopy[1]
        sc.plot(center[0], center[1], marker=markers[i],
                color=colors[i], markersize=10)
        t1_circle = plt.Circle(
            xy=(center[0], center[1]), radius=t1, color=&#39;dodgerblue&#39;, fill=False)
        t2_circle = plt.Circle(
            xy=(center[0], center[1]), radius=t2, color=&#39;skyblue&#39;, alpha=0.2)
        sc.add_artist(t1_circle)
        sc.add_artist(t2_circle)        for component in components:
            sc.plot(component[0], component[1],
                    marker=markers[i], color=colors[i], markersize=1.5)
    maxvalue = np.amax(dataset)
    minvalue = np.amin(dataset)
    plt.xlim(minvalue - t1, maxvalue + t1)
    plt.ylim(minvalue - t1, maxvalue + t1)
    plt.show()

レンダリングは次のとおりです:

Pythonでキャノピークラスタリングを実装する方法

以上がPythonでキャノピークラスタリングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。