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初期化メソッド | 重心を初期化するために使用されるメソッド。 有効な値: Random、First K、Uniform、K-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 | 不可 | トレーニング用に入力テーブルから選択されたパーティション。 次の形式がサポートされています。
説明 複数のパーティションはコンマ (,) で区切ります。 | すべてのパーティション |
appendColNames | 不可 | クラスタリング結果テーブルに追加される入力列。 列名はコンマ (,) で区切ります。 | N/A |
enableSparse | 不可 | 入力データがスパースかどうかを指定します。 有効な値は true と false です。 | false |
itemDelimiter | 不可 | キーと値のペアを区切るために使用される区切り文字。 | コンマ (,) |
kvDelimiter | 不可 | キーと値のペアでキーと値を区切るために使用される区切り文字。 | コロン (:) |
centerCount | 可 | クラスタリング重心の数。 有効な値: 1 ~ 1000 | 10 |
distanceType | 不可 | 距離を測定するために使用されるメソッド。 有効な値:
| euclidean |
initCenterMethod | 不可 | 重心を初期化するために使用されるメソッド。 有効な値:
| 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形式の入力データ:
次のいずれかの方法でテストデータを生成します。
初期重心テーブルを使用する
テーブル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;
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;
クラスタリング結果テーブル、クラスタリング統計テーブル、およびクラスタリング重心テーブルを表示します。
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 | +---------------+------------+------------+
スパース形式の入力データ:
テストデータを生成します。
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を使用して、値が欠落しているセルを代入します。 複数の列が入力として使用される場合、これらの列はマージされます。 たとえば、kvs0とkvs1を入力として使用する場合、最初の行には次のデータが含まれます。
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に正しく番号が付けられていない列が含まれている場合は、行列のサイズを小さくするために列の番号を変更することをお勧めします。次の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;
クラスタリング結果テーブル、クラスタリング統計テーブル、およびクラスタリング重心テーブルを表示します。
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 | +---------------+------------+------------+