この記事では、Javaに実装されたKNNアルゴリズムについて説明します。次のように、参照のために共有してください。
誰もがKNNアルゴリズムに精通している必要があり、それらはデータマイニングのトップ10の古典的なアルゴリズムの1つです。
アルゴリズムのアイデアは、トレーニングデータセットに分類されたグループ化の未知のデータをグループ化して分類することです。その中で、距離は未知のポイントとそのトレーニングデータのポイント、最短距離のポイント、およびそのポイントに分類されるカテゴリに基づいて計算されます。
アルゴリズムのエンジニアリングを見てみましょう。
1.データを準備し、データを前処理します
2。適切なデータ構造を選択して、トレーニングデータを保存し、タプルをテストします
3. kなどのパラメーターを設定します
4.サイズKの優先キューを、距離に基づいて大部分から小まで、最近隣接トレーニングのタプルを保管します。トレーニングタプルからkタプルを最初の最近隣接タプルとしてランダムに選択し、テストタプルとこれらのkタプル間の距離を計算し、トレーニングタプルラベルと距離を優先キューに保存します。
5.トレーニングタプルセットを反復し、現在のトレーニングタプルとテストタプルの間の距離を計算し、結果の距離lを優先キューの最大距離lmaxに分割します。
6.比較を行います。 l> = lmaxの場合、タプルが破棄され、次のタプルが横断されます。 l <lmaxの場合、優先キューの最大距離でタプルを削除し、現在のトレーニングタプルを優先キューに保存します。
7.トラバーサルが完了したら、優先キューのkタプルの大部分を計算し、テストタプルのカテゴリとして使用します。
8。テストタプルセットがテストされた後、エラー率を計算し、異なるk値と再訓練を続け、最後に最小のエラー率でk値を取得します。
アルゴリズムプロセスによると、Java言語を実装してください。
パッケージknn;/** *ポイントxおよびy * @author管理者 * */public class pointbean {int x; int y; public int getx(){return x;} public void setx(this.x){this.x = x;} public int gety(){return y;} public sety(int y;} {int y;} 素晴らしい(); this.x = x; this.y = y;} public pointbean(){super();}@overridepublic string toString(){return "pointbean [x =" + x + "、y =" + y + "];}}}KNNアルゴリズム
パッケージknn; import java.util.arraylist;/** * method of knn実装 * @author管理者 * */public class knnmain {public double getpointlength(arraylist <pointbean> list、pointbean bb){int b_x = bb.getx(); int b_y = bb.gety(); double temp =(b_x -list.get(0).getx())*(b_x -list.get(0).getx())+(b_y -list.get(0).gety())*(b_y -list.get(0).gety()); //(int i = 1; i <list.size(); i ++){if(temp((b_x -list.get(i).getx())))の最小距離を見つけます。 temp =(b_x -list.get(i).getx())*(b_x -list.get(i).gety()); }} return math.sqrt(temp); } / ** *長さを取得して、分類用の最小のものを見つけます * @param list1 * @param list2 * @param bb * / public void getContent(arraylist <pointbean> list1、arraylist <pointbean> list2、arraylist <pointbean> list3、pointbean bb) double b = getpointlength(list2、bb); double c = getpointlength(list3、bb); // if(a> b){if(b> c){system.out.println( "this point:"+bb.getx()+"、"+bb.gety()+""+"はc"); } else {system.out.println( "this point:"+bb.getx()+"、"+bb.gety()+""+"はb"); }} else {if(a> c){system.out.println( "this point:"+bb.getx()+"、"+bb.gety()+""+"はc"に属します); } else {if(a> c){system.out.println( "this point:"+bb.getx()+"、"+bb.gety()+""+"はc"); } else {system.out.println( "this point:"+bb.getx()+"、"+bb.gety()+""+"はa"になります); }}}}主な関数
パッケージknn; import java.util.arraylist;/ * * main function knn */public class testjava {static arraylist <pointbean> lista; Static ArrayList <PointBean> listB; Static ArrayList <PointBean> listc; Static ArrayList <PointBean> listd; public static void main(string [] args){// chuangjia arraylist lista = new ArrayList <PointBean>(); listb = new ArrayList <PointBean>(); listc = new ArrayList <PointBean>(); listd = new ArrayList <PointBean>(); // data setdate()を書き込みます。 getTestResult(); } /***結果を取得* /private static void getTestResult(){//オブジェクトを作成しますknmain km = new knnmain(); for(int i = 0; i <listd.size(); i ++){km.getContent(lista、listb、listc、listd.get(i)); }} /*** write data* /private static void setDate(){// aの座標ポイントint a_x [] = {1,1,2,2,1}; int a_y [] = {0,1,1,0,2}; // bの座標ポイントint b_x [] = {2,3,3,3,4}; int b_y [] = {4,4,3,2,3}; // Cの座標ポイントint c_x [] = {4,5,5,6,6,6}; int c_y [] = {1,2,0,2,1}; //データのテスト// Bの座標ポイントint d_x [] = {3,3,3,0,5}; int d_y [] = {0,1,5,0,1}; // PointBean Ba; for(int i = 0; i <5; i ++){ba = new Pointbean(a_x [i]、a_y [i]); lista.add(ba); } // Pointbean bb; for(int i = 0; i <5; i ++){bb = new Pointbean(b_x [i]、b_y [i]); listb.add(bb); } // PointBean BC; for(int i = 0; i <5; i ++){bc = new Pointbean(c_x [i]、c_y [i]); listc.add(bc); } // pointbean bd; for(int i = 0; i <5; i ++){bd = new Pointbean(d_x [i]、d_y [i]); listd.add(bd); }}}テスト結果:
この点:3、1はaに属します
この点:3、5はbに属します
この点:0、0はaに属します
この点:5、1はcに属します
この時点で、単純なKNNアルゴリズムが不明な点の分割を実装しました。これは、誰もがKNNアルゴリズムを理解するのに役立ちます。 KNNを改善するいくつかのアルゴリズムは後で投稿されます。一緒に学び、進歩してください!
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。