すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:K-平均クラスタリング

最終更新日:Jul 22, 2024

K平均クラスタリングは、K個のオブジェクトを各クラスタの初期重心としてランダムに選択し、残りのオブジェクトと重心との間の距離を計算し、残りのオブジェクトを最も近いクラスタに分配し、次いで各クラスタの重心を再計算する。 K平均クラスタリングは、クラスタリングオブジェクトが空間ベクトルであると仮定する。 K平均クラスタリングは、各クラスタ内の平均二乗誤差 (MSE) の合計を最小化し、基準関数が収束するまで計算と反復を常に実行します。

使用上の注意

K-meansクラスタリングコンポーネントを使用する場合は、次の項目に注意する必要があります。

  • cosineが使用される場合、特定のクラスタは空であり得る。 この場合、クラスタの数はK未満である。K個の初期重心は平行ベクトルであり得る。 セントロイドが順番にトラバースされる場合、サンプルは、平行ベクトルであるセントロイドに分配されない。 外部セントロイドテーブルにリストしたK個のセントロイドを使用することを推奨します。

  • 入力テーブルにNULLまたは空の値が含まれている場合、システムは次のエラーを報告します。Algo Job Failed-system error-Null feature value found。 インピュテーションにはデフォルト値を使用することを推奨します。

  • スパースデータが入力として使用され、最大の列IDが2000000を超えると、システムは次のエラーを報告します。Algo Job Failed-システムエラー-機能数は2000000を超えることはできません。 列の番号を0または1から変更することを推奨します。

  • セントロイドモデルが大きすぎるために書き込み操作が失敗した場合、システムは次のエラーを報告します。Algo Job Failed-system error-kIOError: write failed for message: comparison_measure。 データがスパース形式である列の番号を0または1から変更することを推奨します。 col * centerCountの値が270000000より大きい場合は、コマンドを実行してmodelNameパラメーターを削除し、再度クラスタリングを実行します。

  • 入力テーブルの列の名前にSQLキーワードが含まれている場合、システムは次のエラーを報告します。FAILED: Failed Task createCenterTable:kOtherError:ODPS-0130161:[1,558] Parse exception - invalid token ',', expect ")"

  • 入力テーブルのデータ列は、INT型またはDOUBLE型にすることができます。 入力テーブルがスパースの場合、STRING型のデータ列がサポートされます。

コンポーネントの設定

次のいずれかの方法を使用してコンポーネントを設定できます。

方法1: コンソールのパイプライン構成タブでコンポーネントを構成する

Machine Learning Platform for AI (PAI) コンソールのMachine Learning Designerの [パイプライン構成] タブでコンポーネントを構成します。

タブ

パラメーター

説明

フィールド設定

フィーチャー列

トレーニング用に入力テーブルから選択された列。 列名はコンマ (,) で区切ります。 INT型とDOUBLE型の列がサポートされています。 入力データがスパースの場合、STRING型の列がサポートされます。

追加された列

クラスタリング結果テーブルに追加される入力列。 列名はコンマ (,) で区切ります。

入力スパース行列

入力データがスパースかどうかを指定します。 スパースデータは、キーと値のペアを使用して表示されます。

KVペア区切り文字

キーと値のペアを区切るために使用される区切り文字。 デフォルトでは、コンマ (,) が使用されます。

KVデリミタ

キーと値のペアでキーと値を区切るために使用される区切り文字。 デフォルトでは、コロン (:) が使用されます。

パラメーター設定

クラスター

クラスタリング重心の数。 有効な値: 1 ~ 1000

距離測定方法

距離を測定するために使用されるメソッド。 有効な値は、ユークリッドコサインCityblockです。

Centroid初期化メソッド

重心を初期化するために使用されるメソッド。 有効な値: RandomFirst KUniformK-means ++ 、およびUse Initial Centroid Table

最大イテレーション

反復の最大数。 有効な値: 1 ~ 1000

収束条件

イテレーションを終了するためのしきい値。

初期ランダムシード

最初のランダムシード。 デフォルトでは、現在の時刻が使用されます。 このパラメーターが固定値を使用する場合、クラスタリング結果は安定しています。

チューニング

コア

コアの数。 デフォルトでは、システムは値を指定します。

コアあたりのメモリサイズ

各コアのメモリサイズ。 単位:MB。

方法2: PAIコマンドを実行する

PAIコマンドを実行してコンポーネントを設定します。 SQLスクリプトコンポーネントを使用してPAIコマンドを実行できます。 詳細については、「SQLスクリプト」をご参照ください。 次の表に、このコンポーネントを設定するために使用されるPAIコマンドのパラメーターを示します。

pai -name kmeans
    -project algo_public
    -DinputTableName=pai_kmeans_test_input
    -DselectedColNames=f0,f1
    -DappendColNames=f0,f1
    -DcenterCount=3
    -Dloop=10
    -Daccuracy=0.01
    -DdistanceType=euclidean
    -DinitCenterMethod=random
    -Dseed=1
    -DmodelName=pai_kmeans_test_output_model_
    -DidxTableName=pai_kmeans_test_output_idx
    -DclusterCountTableName=pai_kmeans_test_output_couter
    -DcenterTableName=pai_kmeans_test_output_center;

パラメーター

必須

説明

デフォルト値

inputTableName

入力テーブルの名前。

N/A

selectedColNames

不可

トレーニング用に入力テーブルから選択された列。 列名はコンマ (,) で区切ります。 INT型とDOUBLE型の列がサポートされています。 入力データがスパースの場合、STRING型の列がサポートされます。

すべての列

inputTablePartitions

不可

トレーニング用に入力テーブルから選択されたパーティション。 次の形式がサポートされています。

  • Partition_name=value

  • name1=value1/name2=value2: マルチレベルパーティション

説明

複数のパーティションはコンマ (,) で区切ります。

すべてのパーティション

appendColNames

不可

クラスタリング結果テーブルに追加される入力列。 列名はコンマ (,) で区切ります。

N/A

enableSparse

不可

入力データがスパースかどうかを指定します。 有効な値は truefalse です。

false

itemDelimiter

不可

キーと値のペアを区切るために使用される区切り文字。

コンマ (,)

kvDelimiter

不可

キーと値のペアでキーを区切るために使用される区切り文字。

コロン (:)

centerCount

クラスタリング重心の数。 有効な値: 1 ~ 1000

10

distanceType

不可

距離を測定するために使用されるメソッド。 有効な値:

  • euclidean: 次の式を使用して計算されるユークリッド距離d (x - c) = (x - c) (x - c)'

  • cosine: 次の式を使用して計算されるコサインです。cosine

  • 都市ブロック: マンハッタン距離とも呼ばれる都市ブロック距離。 次の式を使用して計算されます。d (x - c) = | x - c |

euclidean

initCenterMethod

不可

重心を初期化するために使用されるメソッド。 有効な値:

  • random: K個の初期重心が入力データからランダムにサンプリングされます。 初期ランダムシードは、seedパラメーターを使用して指定します。

  • topk: 入力データの最初のK行が初期重心として使用されます。

  • 均一: K個の初期重心が最小値から最大値まで計算されます。 これは、これらの初期重心が均等に分布することを保証する。

  • kmpp: K個の初期重心は、k-means ++ アルゴリズムを使用することによって得られる。

  • external: このメソッドは、テーブル内の追加の初期重心を指定します。

random

initCenterTableName

不可

初期重心を一覧表示するテーブルの名前。 このパラメーターは、initCenterMethodパラメーターがexternalに設定されている場合にのみ有効です。

N/A

ループ

不可

反復の最大数。 有効な値: 1 ~ 1000

100

精度

不可

アルゴリズムを終了する条件。 2回の反復の間の客観的な差がこのパラメータの値より小さい場合、アルゴリズムは終了する。

0.1

シード

不可

最初のランダムシード。

現在の時刻

modelName

不可

出力モデルの名前。

N/A

idxTableName

クラスタリング後に各レコードが属するクラスターのIDを含む、クラスタリング結果テーブルの名前。

N/A

idxTablePartition

不可

クラスタリング結果テーブルのパーティション。

N/A

clusterCountTableName

不可

各クラスターに含まれるポイントの数を記録するクラスタリング統計テーブル。

N/A

centerTableName

不可

クラスタリング重心テーブル。

N/A

coreNum

不可

コアの数。 このパラメーターは、memSizePerCoreパラメーターと一緒に使用する必要があります。 コアの数。 有効な値: 1 ~ 9999

自動割り当て

memSizePerCore

不可

各コアのメモリサイズ。 有効な値: 1024〜65536。 単位:MB。

自動割り当て

ライフサイクル

不可

出力テーブルのライフサイクル。 単位:日

N/A

Output

K平均クラスタリングコンポーネントの出力データは、クラスタリング結果テーブル、クラスタリング統計テーブル、およびクラスタリング重心テーブルを含む。 出力フォーマット:

  • クラスタリング結果テーブル

    説明

    appendColNames

    追加された列の名前。

    cluster_index

    トレーニングテーブルで各サンプルが割り当てられるクラスター。

    距離

    トレーニングテーブルの各サンプルからクラスター重心までの距離。

  • 統計テーブルのクラスタリング

    説明

    cluster_index

    クラスターの ID。

    cluster_count

    各クラスター内のサンプル数。

  • 重心テーブルのクラスタリング

    説明

    cluster_index

    クラスターの ID。

    selectedColNames

    トレーニング用のトレーニングテーブルから選択された列。

例:

dense形式の入力データ:

  1. 次のいずれかの方法でテストデータを生成します。

    • 初期重心テーブルを使用する

      テーブルpai_kmeans_test_init_centerを作成する

      create table pai_kmeans_test_init_center as
      select * from
      (
      select 1 as f0,2 as f1
      union all
      select 1 as f0,3 as f1
      union all
      select 1 as f0,4 as f1
      )tmp;
    • 他の初期重心を使う

      create table pai_kmeans_test_input as
      select * from
      (
        select 'id1' as id,1 as f0,2 as f1
        union all
        select 'id2' as id,1 as f0,3 as f1
        union all
        select 'id3' as id,1 as f0,4 as f1
        union all
        select 'id4' as id,0 as f0,3 as f1
        union all
        select 'id5' as id,0 as f0,4 as f1
      )tmp;
  2. PAIコマンドを実行して、K-means Clusteringコンポーネントのパラメーターを送信します。

    • 初期重心テーブルを使用する

      drop table if exists pai_kmeans_test_output_idx;
      yes
      drop table if exists pai_kmeans_test_output_couter;
      yes
      drop table if exists pai_kmeans_test_output_center;
      yes
      drop offlinemodel if exists pai_kmeans_test_output_model_;
      yes
      pai -name kmeans
          -project algo_public
          -DinputTableName=pai_kmeans_test_input
          -DinitCenterTableName=pai_kmeans_test_init_center
          -DselectedColNames=f0,f1
          -DappendColNames=f0,f1
          -DcenterCount=3
          -Dloop=10
          -Daccuracy=0.01
          -DdistanceType=euclidean
          -DinitCenterMethod=external
          -Dseed=1
          -DmodelName=pai_kmeans_test_output_model_
          -DidxTableName=pai_kmeans_test_output_idx
          -DclusterCountTableName=pai_kmeans_test_output_couter
          -DcenterTableName=pai_kmeans_test_output_center;
    • ランダムに選択された初期重心を使用する

      drop table if exists pai_kmeans_test_output_idx;
      yes
      drop table if exists pai_kmeans_test_output_couter;
      yes
      drop table if exists pai_kmeans_test_output_center;
      yes
      drop offlinemodel if exists pai_kmeans_test_output_model_;
      yes
      pai -name kmeans
          -project algo_public
          -DinputTableName=pai_kmeans_test_input
          -DselectedColNames=f0,f1
          -DappendColNames=f0,f1
          -DcenterCount=3
          -Dloop=10
          -Daccuracy=0.01
          -DdistanceType=euclidean
          -DinitCenterMethod=random
          -Dseed=1
          -DmodelName=pai_kmeans_test_output_model_
          -DidxTableName=pai_kmeans_test_output_idx
          -DclusterCountTableName=pai_kmeans_test_output_couter
          -DcenterTableName=pai_kmeans_test_output_center;
  3. クラスタリング結果テーブル、クラスタリング統計テーブル、およびクラスタリング重心テーブルを表示します。

    • idxTableNameで指定された結果テーブルのクラスタリング

      +------------+------------+---------------+------------+
      | f0         | f1         | cluster_index | distance   |
      +------------+------------+---------------+------------+
      | 1          | 2          | 0             | 0.0        |
      | 1          | 3          | 1             | 0.5        |
      | 1          | 4          | 2             | 0.5        |
      | 0          | 3          | 1             | 0.5        |
      | 0          | 4          | 2             | 0.5        |
      +------------+------------+---------------+------------+
    • clusterCountTableNameで指定された統計テーブルのクラスタリング

      +---------------+---------------+
      | cluster_index | cluster_count |
      +---------------+---------------+
      | 0             | 1             |
      | 1             | 2             |
      | 2             | 2             |
      +---------------+---------------+
    • centerTableNameで指定された重心テーブルのクラスタリング

      +---------------+------------+------------+
      | cluster_index | f0         | f1         |
      +---------------+------------+------------+
      | 0             | 1.0        | 2.0        |
      | 1             | 0.5        | 3.0        |
      | 2             | 0.5        | 4.0        |
      +---------------+------------+------------+

スパース形式の入力データ:

  1. テストデータを生成します。

    create table pai_kmeans_test_sparse_input as
    select * from
    (
      select 1 as id,"s1" as id_s,"0:0.1,1:0.2" as kvs0,"2:0.3,3:0.4" as kvs1
      union all
      select 2 as id,"s2" as id_s,"0:1.1,2:1.2" as kvs0,"4:1.3,5:1.4" as kvs1
      union all
      select 3 as id,"s3" as id_s,"0:2.1,3:2.2" as kvs0,"6:2.3,7:2.4" as kvs1
      union all
      select 4 as id,"s4" as id_s,"0:3.1,4:3.2" as kvs0,"8:3.3,9:3.4" as kvs1
      union all
      select 5 as id,"s5" as id_s,"0:5.1,5:5.2" as kvs0,"10:5.3,6:5.4" as kvs1
    )tmp;

    入力データがスパースの場合、0を使用して、値が欠落しているセルを代入します。 複数の列が入力として使用される場合、これらの列はマージされます。 たとえば、kvs0kvs1を入力として使用する場合、最初の行には次のデータが含まれます。

    0:0.1,1:0.2,2:0.3,3:0.4,4:0,5:0,6:0,7:0,8:0,9:0,10:0

    この例では、疎行列は0から番号が付けられ、5行11列を有する。 kvsの列に123456789:0.1が含まれている場合、スパース行列には5行123456789列があります。 この行列は、大量のCPUおよびメモリリソースを消費する。 kvsに正しく番号が付けられていない列が含まれている場合は、行列のサイズを小さくするために列の番号を変更することをお勧めします。

  2. 次のPAIコマンドを実行して、K-means Clusteringコンポーネントのパラメーターを送信します。

    pai -name kmeans
      -project algo_public
      -DinputTableName=pai_kmeans_test_sparse_input
      -DenableSparse=true
      -DselectedColNames=kvs0,kvs1
      -DappendColNames=id,id_s
      -DitemDelimiter=,
      -DkvDelimiter=:
      -DcenterCount=3
      -Dloop=100
      -Daccuracy=0.01
      -DdistanceType=euclidean
      -DinitCenterMethod=topk
      -Dseed=1
      -DmodelName=pai_kmeans_test_input_sparse_output_model
      -DidxTableName=pai_kmeans_test_sparse_output_idx
      -DclusterCountTableName=pai_kmeans_test_sparse_output_couter
      -DcenterTableName=pai_kmeans_test_sparse_output_center;
  3. クラスタリング結果テーブル、クラスタリング統計テーブル、およびクラスタリング重心テーブルを表示します。

    • idxTableNameで指定された結果テーブルのクラスタリング

      +------------+------------+---------------+------------+
      | id         | id_s       | cluster_index | distance   |
      +------------+------------+---------------+------------+
      | 4          | s4         | 0             | 2.90215437218629 |
      | 5          | s5         | 1             | 0.0        |
      | 1          | s1         | 2             | 0.7088723439378913 |
      | 2          | s2         | 2             | 1.1683321445547923 |
      | 3          | s3         | 0             | 2.0548722588034516 |
      +------------+------------+---------------+------------+
    • clusterCountTableNameで指定された統計テーブルのクラスタリング

      +---------------+---------------+
      | cluster_index | cluster_count |
      +---------------+---------------+
      | 0             | 2             |
      | 1             | 1             |
      | 2             | 2             |
      +---------------+---------------+
    • centerTableNameで指定された重心テーブルのクラスタリング

      +---------------+------------+------------+
      | cluster_index | kvs0       | kvs1       |
      +---------------+------------+------------+
      | 0             | 0:2.6,1:0,2:0,3:1.1,4:1.6,5:0 | 6:1.15,7:1.2,8:1.65,9:1.7,10:0 |
      | 1             | 0:5.1,1:0,2:0,3:0,4:0,5:5.2 | 6:5.4,7:0,8:0,9:0,10:5.3 |
      | 2             | 0:0.6,1:0.1,2:0.75,3:0.2,4:0.65,5:0.7 | 6:0,7:0,8:0,9:0,10:0 |
      +---------------+------------+------------+