Opencv Advanced 08-K Means Clustering cv2.kmeans() の概要と例

K 平均法クラスタリングは、一連のデータ ポイントを異なるクラスター (クラスター) に分割するために使用される一般的な教師なし学習アルゴリズムです。これにより、同じクラスター内ではデータ ポイントがより類似する一方、異なるクラスター間の差異は大きくなります。K 平均法クラスタリングの目的は、データ ポイントとそれが属するクラスターの中心との間の距離を最小限に抑えてクラスターを形成することです。

離散値を予測したい場合に行う作業は「分類」です。たとえば、子供が良い運動選手になるかどうかを予測するには、その子供を「良い子供」 (良い運動選手になれる) または「平均的な子供」 (良い運動選手になれない) に分類することになります。連続値を予測したい場合に行う作業は「回帰」です。

たとえば、アスリートとしての子供の将来を予測する指数は、0.99 または 0.36 などと計算されます。機械学習モデルは、トレーニング セット内のデータをいくつかのグループに分割することもでき、各グループは「クラスター」と呼ばれます。

これらの自動的に形成されたクラスターは、「バスケットボールの苗」や「長距離走の苗」など、さまざまな潜在的な概念に対応する可能性があります。この学習方法は「クラスタリング」と呼ばれ、学習過程で学習サンプルにラベルを付ける必要がないことが大きな特徴です。つまり、学習プロセスは、既存のトレーニング セットに基づいて自動的に分類 (クラスタリング) を実行できます。

訓練データにラベルが付けられているかどうかに応じて、学習を教師あり学習と教師なし学習に分けることができます。

前に紹介した K 最近傍マシンとサポート ベクター マシンはすべて教師あり学習であり、アルゴリズムが学習するラベル付きデータを提供し、データを分類します。また、クラスタリングは教師なし学習であり、事前に分類ラベルが何であるかを知ることなく、データを直接分類します。

簡単な例を挙げると、豆が 100 個あり、そのうち 40 個が緑豆、40 個が大豆であることがわかっている場合、上記のラベルに従って、残りの 20 個の豆を緑豆と大豆に分ける教師学習が行われます。

上記の問題を解決するには、K 最近傍アルゴリズムを使用して、分類される現在の Bean のサイズを計算し、最も近い 5 つの Bean のサイズを調べて、5 つの Bean のうちのどれが最も大きいかを決定します。現在の Bean が最大の番号を持つ Bean となる Bean クラスのクラス。

同様に、豆は 100 個あり、これらの豆の中に 2 種類の異なる品種があることだけがわかっていますが、どの品種であるかはわかりません。この時点で、Bean は、サイズ、色の属性、またはサイズと色の属性の組み合わせに基づいて 2 つのタイプに分類できます。この際、既知のラベルを使用せずに分類を完了しましたが、このときの分類は一種の教師なし学習です。

クラスタリングは、類似した属性を持つオブジェクトを同じセット (クラスター) にグループ化する教師なし学習の一種です。クラスタリング手法はすべてのオブジェクトに適用でき、クラスタ内のオブジェクトが類似しているほど、クラスタリング アルゴリズムの効果が高くなります。

理論的根拠

このセクションでは、最初に K-means クラスタリングの基本原理を例とともに紹介し、次に K-means クラスタリングの基本手順を紹介し、最後に 2 次元空間での K-means クラスタリングの例を紹介します。

豆を割る

6 つの豆が混合されていると仮定すると、これらの豆のカテゴリーが分からなくても、直径に応じて 2 つのカテゴリーに分けることができます。

測定後、これらの豆の直径は 1、2、3、10、20、30 mm (ミリメートル) です。それらを A、B、C、D、E、F としてマークし、分類操作を実行してみましょう。

ステップ 1 : 2 つの参照 Bean がランダムに選択されます。たとえば、直径 1 mm の豆 A と直径 2 mm の豆 B が分類基準豆としてランダムに使用されます。

ステップ 2 : 豆 A と豆 B から各豆の直径の距離を計算します。どちらの Bean に近いかにかかわらず、新しい Bean をその Bean が存在するグループに分割します。距離の計算基準として直径を使用した場合の計算結果は表 22-1 に示されます。

ここに画像の説明を挿入
このステップの最後で、6 つの豆は次の 2 つのグループに分けられます。

  • グループ 1: 豆 A のみ。
  • グループ 2: 豆 B、C、D、E、F、合計 5 つの豆。

ステップ 3 : グループ 1 の豆とグループ 2 の豆の平均直径をそれぞれ計算します。次に、個々の豆が
平均直径からの距離に基づいてグループ化されます。

  • グループ 1 の豆の平均値 AV1 = 1mm を計算します。
  • グループ 2 の豆の平均値 AV2 = (2+3+10+20+30)/5 = 13mm を計算します。

上記の平均を取得した後、すべての Bean を再度グループ化します。

  • 平均値 AV1 が存在するグループを AV1 グループとしてマークします。
  • 平均値 AV2 が存在するグループを AV2 グループとしてマークします。

平均値AV1とAV2から各Beanの距離を計算し、表22-2に示すようにグループ分けを決定します。

ここに画像の説明を挿入
平均値 AV1 に近い Bean はグループ AV1 として分類され、平均値 AV2 に近い Bean はグループ AV2 としてグループ化されます。さて、6 つの Bean のグループ分けは次のようになります。

  • グループ AV1: 豆 A、豆 B、豆 C。
  • グループ AV2: 豆 D、豆 E、豆 F。

ステップ 4 : グループ化が安定し、変化しなくなるまでステップ 3 を繰り返します。その後、グループ化は完了したとみなされます。
この例では、グループ AV1 の平均値 AV41 とグループ AV2 の平均値 AV42 を再計算し、平均値 AV41、AV42 からの各 Bean の距離を順に計算し、以下に基づいてグループを再分割します。この距離。ステップ 3 と同じ方法に従って、平均を再計算してグループ化すると、6 つの Bean のグループ化は次のようになります。

  • グループ AV41: 豆 A、豆 B、豆 C。
  • グループ AV42: 豆 D、豆 E、豆 F。

前回のグループ化と比較して、変化がなければグループ化は完了したものとみなします
直径が小さいグループを「小さな豆」、直径が大きいグループを「大きな豆」と呼びます。

もちろん、この例は極端な例であり、データはすぐに収束しますが、実際の処理では、データが収束するまでに複数回の反復が必要となり、分類が変更されなくなる可能性があります。

K-means クラスタリング関数

OpenCV は、K-means クラスタリングを実装する関数 cv2.kmeans() を提供します。この関数の構文は次のとおりです。

retval、bestLabels、center=cv2.kmeans(データ、K、bestLabels、基準、
試行、フラグ)

式内の各パラメータの意味は次のとおりです。

  • data: 処理対象の入力データ セット。np.float32 タイプである必要があり、各特徴は個別の列に配置されます。

  • K: 分離するクラスターの数、つまり分類数。最も一般的なのは K=2 で、二値分類を意味します。

  • bestLabels: 計算後の各データ ポイントの最終的な分類ラベル (インデックス) を示します。実際に呼び出されるとき、パラメータ bestLabels の値は None に設定されます。

  • criteria: アルゴリズム反復の終了基準。最大サイクル数または指定された精度しきい値に達すると、アルゴリズムは分類反復計算の継続を停止します。このパラメータは、type、max_iter、eps の 3 つのサブパラメータで構成されます。
    type は終了のタイプを示します。これには次の 3 つの状況が考えられます。

    • cv2.TERM_CRITERIA_EPS: 精度が eps に達したら反復を停止します。
    • cv2.TERM_CRITERIA_MAX_ITER: 反復数がしきい値 max_iter を超えると反復を停止します。
    • cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:
      上記 2 つの条件のいずれかが満たされた場合、反復を停止します。
  • max_iter: 反復の最大数。

  • eps: 精度のしきい値。

  • 試行: 実際の実装では、最良の分類効果を得るために、
    複数の試行に対して異なる初期分類値を使用する必要がある場合があります。試行の値を指定すると、アルゴリズムは
    異なる初期値で複数の (試行) 試行を行うことができます。

  • flags: 初期中心点の選択方法を示し、主に以下の 3 種類があります。

    • cv2.KMEANS_RANDOM_CENTERS: 中心点をランダムに選択します。
    • cv2.KMEANS_PP_CENTERS: 集中化アルゴリズムに基づいて中心点を選択します。
    • cv2.KMEANS_USE_INITIAL_LABELS: ユーザーが入力したデータを最初の分類中心点として使用します。
      アルゴリズムが複数回試行する必要がある場合 (試行値が 1 より大きい場合)、後続の試行ではランダムまたは半
      ランダム最初の分類中心点
      戻り値の意味は次のとおりです。
  • retval: 距離値 (密度値または近さとも呼ばれる) は、各点から対応する中心点までの距離の二乗和を返します。

  • bestLabels: 各データ ポイントの最終的な分類ラベル (インデックス)。

  • center: 各カテゴリの中心点データ。

例: 米粒が山積みになっており、長さと幅で分類されています。

理解を容易にするために、米粒には 2 種類があり、1 つは XM、もう 1 つは DM であると仮定します。それらの直径は異なり、XM の長さおよび幅は両方とも [0, 20] であり、DM の長さおよび幅は [40, 60] です。乱数を使用して 2 つの米粒の長さと幅をシミュレートし、関数 cv2.kmeans() を使用して分類します。
トピックの要件に従って、主な手順は次のとおりです。

(1) 2 つのグループの米粒のデータをランダムに生成し、関数 cv2.kmeans() で処理できる形式に変換します。
(2) 関数 cv2.kmeans() のパラメータ形式を設定します。
(3) cv2.kmeans() 関数を呼び出します。
(4) 関数 cv2.kmeans() の戻り値に従って分類結果を決定します。
(5) 分類されたデータと中心点を描画し、分類結果を観察します。

コードは以下のように表示されます:

import numpy as np
import cv2
from matplotlib import pyplot as plt
# 随机生成两组数值
# xiaomi ,长和宽都在[0,20]
xiaomi = np.random.randint(0,20,(30,2))
#dami ,长和宽的大小都在[40,60]

dami = np.random.randint(40,60,(30,2))
# 组合数据
MI = np.vstack((xiaomi,dami))
# 转换为 float32 类型
MI = np.float32(MI)
# 调用 kmeans 模块
# 设置参数 criteria 值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# 调用 kmeans 函数
ret,label,center=cv2.kmeans(MI,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
'''
#打印返回值
print(ret)
print(label)
print(center)
'''
# 根据 kmeans 的处理结果,将数据分类,分为 XM 和 DM 两大类
XM = MI[label.ravel()==0]
DM = MI[label.ravel()==1]
# 绘制分类结果数据及中心点
plt.scatter(XM[:,0],XM[:,1],c = 'g', marker = 's')
plt.scatter(DM[:,0],DM[:,1],c = 'r', marker = 'o')
plt.scatter(center[0,0],center[0,1],s = 200,c = 'b', marker = 'o')
plt.scatter(center[1,0],center[1,1],s = 200,c = 'b', marker = 's')
plt.xlabel('Height'),plt.ylabel('Width')
plt.show()

ここに画像の説明を挿入
右上の小さな四角は「0」というラベルの付いたデータ ポイントであり、左下の点は「1」という
ラベルの付いたデータ ポイントです。右上の少し大きな点は「0」というラベルの付いたデータ グループの中心点であり、左下の少し大きな四角形は「1」というラベルの付いたデータ グループの中心点です。

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132336342