1。はじめに
K-Meanクラスタリングアルゴリズムは、最初にKオブジェクトを初期クラスタリングセンターとしてランダムに選択します。次に、各オブジェクトと各シードクラスターの中心との間の距離が計算され、各オブジェクトはそれに最も近いクラスター中心に割り当てられます。クラスターセンターとそれらに割り当てられたオブジェクトは、クラスターを表します。すべてのオブジェクトが割り当てられると、各クラスターのクラスター中心は、クラスター内の既存のオブジェクトに基づいて再計算されます。このプロセスは、特定の終了条件が満たされるまで繰り返されます。終了条件は、NO(または最小数)オブジェクトが異なるクラスターに再割り当てされ、クラスターセンターのNO(または最小数)が再び変更され、2乗エラーの合計が局所的に最小限であることがあります。
2。クラスタリングとは何ですか
クラスタリングは、特定の側面で類似しているデータメンバーを並べ替えて整理するプロセスです。クラスタリングは、この内部構造を発見するためのテクノロジーです。クラスタリングテクノロジーは、多くの場合、教師なし学習と呼ばれます。
3。K-Mean Clusteringとは何ですか
K-Meanクラスタリングは最も有名なパーティションクラスタリングアルゴリズムであり、そのシンプルさと効率性により、すべてのクラスタリングアルゴリズムで最も広く使用されています。データポイントセットと必要な数のクラスターkが与えられた場合、kはユーザーによって指定され、K-Meanアルゴリズムは特定の距離関数に従ってデータをKクラスターに繰り返し分割します。
4。実装
Javaコードは次のとおりです。
パッケージorg.algorithm; import java.util.arraylist; import java.util.random;/*** k-meanクラスタリングアルゴリズム*/public class kmeans {private int k; // cmeans {private int m; arrayList <float []> dataset; //データセットリンクリストプライベートアレイリスト<float []> center; //リンクリンクリストプライベートアレイリスト<arraylist <float []> cluster; // cluster private arraylist <float> jc; // sum of quared errorsの合計は、プライベートランダムに誤りがあります。グループ化** @param Dataset*/public void setDataset(arrayList <float []> dataset){this.dataset = dataset;}/*** @return result set*/public arraylist <arraylist <float []> get cluster; * @param k* k <= 0の場合、k <= 0の場合、kがデータソースの長さよりも大きい場合、クラスターの数は、データソースの長さに設定されています。 dataset.size()== 0){initdataset();} dataset.size(); if(k> datasetlength){k = datasetlength;} center = initcenters(); cluster = initcluster(); jc = internaylist <float>();使用される*/private void initdataset(){dataset = new arraylist <float []>(); // {6,3}は同じであるため、長さ15のデータセットを14のクラスターと15のクラスターに分割する誤差は0 float [] [] dataSetarray = new float [] {4、2}、{7、3}、{6、2}、{4、7}、{6、3}、{5、3}、{6、3}、{6、9}、{1、6}、{3、9}、{3、9}、{4、1}、{8、6}}}}; i ++){dataset.add(datasetarray [i]);}}/***中央データリンクリストを初期化します。 int [k]; boolean flag; int temp = random.nextint(datasetlength); randoms [0] = temp; for(int i = 1; i <k; i ++){flag = true; while;(flad.nextint(datasetlength); int j = 0 ;/ for(j = 0; j <i; ++ j)// {// if(temp == randoms [j]); // { // 壊す; //} //} while(j <i){if(temp == randoms [j]){break;} j ++;} if(j == i){flag = false;}} randoms [i] = temp;} //ランダム数生成状況//(int i = 0; i <k; i ++)// {// System.out.println( "test1:randoms ["+i+"] ="+randoms [i]); //} // System.out.println(); for(int i = 0; i <k; i ++){center.add(dataset.get(randoms [i])); //生成初期化センターリンク}リターンセンター;}/*** @return空のデータのクラスターがkクラスターに分割されています*/private arraylist < {arrayList <arrayList <float [] >> cluster = new arrayList <rayList <float [] >>(); for(int i = 0; i <k; i ++){cluster.add(new arraylist <float []>());} returning cluster;} @return距離 */プライベートフロート距離(float [] element、float [] center){float distance = 0.0f; float x = element [0] - float y = element [1] - float z = x * x + y * y;距離=(フロート)Math.sqrt(z); return Distantion;距離配列* @ @return距離配列の最小距離の位置*/private int mindistance(float mindistance = distance [0]; int minlocation = 0; for(int i = 1; i <distance.length; i ++){if(distance [i] <mindistance){mindistance = dsistance = distance = i; minlocation = i; minlocation = i; i; I等しく、ランダムな位置を返します{if(random.nextint(10)<5){minlocation = i;}}} return minlocation;}/*** core、最小距離センターに関連するクラスターに現在の要素を置きます*/private void clusterset(){){float [] distance = une float [k]; k; j ++){j] = distance(dataset.get(i)、center.get(j)); // system.out.println( "+" dataset ["+i+"]、center ["+j+"]、距離= "+距離[j]);} System.out.println( "test3:"+"dataset ["+i+"]、minlocation ="+minlocation); // system.out.println(); cluster.get(minlocation).add(dataset.get(i)); // core、最小距離センターに関連するクラスターに現在の要素を配置します}}/** * 2つのポイントの誤差の正方形 * * @paramセンター *ポイント2 * @returnエラー */プライベートフロート[] = float [] boat [] center [0]; float y = element [1] - center [1]; float errsquare = x * x + y * y; return errsquare;}/** * 2乗基準関数関数方法のエラー合計 */private void countrule(){float jcf = 0; for(int i = 0; i <cluster.size(); i ++){for(int j = 0; j <cluster.get(i).size(); j ++){jcf+= errorsquare(i)。 setNewCenter(){for(int i = 0; i <k; i ++){int n = cluster.get(i).size(); if(n!= 0){float [] newcenter = {0、0}; cluster.get(i).get(j)[1];} //平均的なnewcenter [0] = newcenter [0]/ n; newcenter [1] = newcenter [1]/ n; center.set(i、newcenter);}}/ **** @param dataset* @paramaryname*/ print dataset*/ *** printdataarray(arraylist <float []> dataarray、string dataarrayname){for(int i = 0; i <dataarray.size(); i ++){system.out.println( "print:" + dataarrayname + "[" + i + "] = {" + dataarray.get(i)[0] + " +" "}");} system.out.println( "==================================================================== =================================================== ");}/** * kmeansアルゴリズムコアプロセスメソッド */private void kmeans(){init(); // printdataarray(dataset、 "initdataset"); // printdataarray(center、 "initcenter"); //エラーが変更されないままになるまでループのグループ化(true){clusterSet(); // //} countrule(); // system.out.println( "count:"+"jc ["+m+"] ="+jc.get(m)); // system.out.println(); //エラーは変更されません、(m!= 0){if(jc.get(m)-jc.get(m -1)== 0){break;}} setNewCenter(); // printDataArray(center、 "newcenter"); M ++; cluster.clear(); cluster = initcluster();} // System.out.println( "注:繰り返しの時間:m ="+m); // output Iterations}/*** execution algorithm*/public void execute(){long starttime = system.currenttimemillis(); system.out.out.out.out.out.Out System.CurrentTimeMillis(); System.out.println( "kmeans running time =" +(endtime -starttime) + "ms"); system.out.println( "kmeans end"); system.out.println();}}}5。説明:
特定のコードはオンラインで見つかり、コメントが追加され、自分の理解に応じて部分的に変更されます。コメントが正しくない場合は、修正したいと考えています。
6。テスト
パッケージorg.test; import java.util.arraylist; import org.algorithm.kmeans; public class kmeanstest {public static void main(string [] args){// kmeanオブジェクトを初期化し、10 kmeans k = new kmeans(10); arraylist <float = new kmeans []> new kmeans(10); arraylist <float []>(); dataset.add(new float [] {1,2}); dataset.add(new float [] {3,3}); dataset.add(new float [] {3,4}); dataset.add(new float [] {5,6}); dataset.add(new float [] {8,9}); dataset.add(new float [] {4,5}); dataset.add(new float [] {6,4}); dataset.add(new float [] {3,9}); dataset.add(new float [] {5,9}); dataset.add(new float [] {4,2}); dataset.add(new float [] {1,9}); dataset.add(new float [] {1,9}); dataset.add(new float [] {1,9}); dataset.add(new float [] {5,9}); dataset.add(new float [] {4,2}); dataset.add(new float [] {1,9}); dataset.add(new float [] {1,9}); dataset.add(new float [] {1,9}); dataset.add(new float [] {5,9}); dataset.add(new float [] {5,9}); dataset.add(new float [] {4,2}); dataset.add(new float [] {1,9}); dataset.add(new float [] {7,8}); //元のデータセットk.setdataset(データセット)クラスタリング結果ArrayList <arrayList <float [] >> cluster = k.getCluster(); //(int i = 0; i <cluster.size(); i ++){k.printdataarray(k.print.get(i)、 "cluster ["+i+"];}}}の結果を表示概要:テストコードが渡されました。クラスタリングの結果が表示され、結果は基本的に要件を満たしました。より正確なアルゴリズムがあるかどうかはまだ発見されていません。特定のプラクティスを調査する必要があります
要約します
上記は、k-meanクラスタリングアルゴリズムのJavaバージョン実装コードの例に関するこの記事の全体的な内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!