最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)的KNN算法示例

 更新時(shí)間:2018年06月23日 02:47:07   作者:帶頭大哥不是我  
這篇文章主要介紹了Java實(shí)現(xiàn)的KNN算法,結(jié)合實(shí)例形式分析了KNN算法的原理及Java定義與使用KNN算法流程、訓(xùn)練數(shù)據(jù)相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Java實(shí)現(xiàn)的KNN算法。分享給大家供大家參考,具體如下:

提起KNN算法大家應(yīng)該都不會(huì)陌生,對于數(shù)據(jù)挖掘來說算是十大經(jīng)典算法之一。

算法的思想是:對于訓(xùn)練數(shù)據(jù)集中已經(jīng)歸類的分組,來對于未知的數(shù)據(jù)進(jìn)行分組歸類。其中是根據(jù)該未知點(diǎn)與其訓(xùn)練數(shù)據(jù)中的點(diǎn)計(jì)算距離,求出距離最短的點(diǎn),并將其歸入該點(diǎn)的那一類。

看看算法的工程吧:

1. 準(zhǔn)備數(shù)據(jù),對數(shù)據(jù)進(jìn)行預(yù)處理
2. 選用合適的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)訓(xùn)練數(shù)據(jù)和測試元組
3. 設(shè)定參數(shù),如k
4.維護(hù)一個(gè)大小為k的的按距離由大到小的優(yōu)先級隊(duì)列,用于存儲(chǔ)最近鄰訓(xùn)練元組。隨機(jī)從訓(xùn)練元組中選取k個(gè)元組作為初始的最近鄰元組,分別計(jì)算測試元組到這k個(gè)元組的距離,將訓(xùn)練元組標(biāo)號和距離存入優(yōu)先級隊(duì)列
5. 遍歷訓(xùn)練元組集,計(jì)算當(dāng)前訓(xùn)練元組與測試元組的距離,將所得距離L 與優(yōu)先級隊(duì)列中的最大距離Lmax
6. 進(jìn)行比較。若L>=Lmax,則舍棄該元組,遍歷下一個(gè)元組。若L < Lmax,刪除優(yōu)先級隊(duì)列中最大距離的元組,將當(dāng)前訓(xùn)練元組存入優(yōu)先級隊(duì)                  列。
7. 遍歷完畢,計(jì)算優(yōu)先級隊(duì)列中k 個(gè)元組的多數(shù)類,并將其作為測試元組的類別。
8. 測試元組集測試完畢后計(jì)算誤差率,繼續(xù)設(shè)定不同的k值重新進(jìn)行訓(xùn)練,最后取誤差率最小的k 值。

根據(jù)算法的過程我們進(jìn)行java語言實(shí)現(xiàn):

package KNN;
/**
 * 點(diǎn)的坐標(biāo) x 、y
 * @author Administrator
 *
 */
public class PointBean {
int x;
int y;
public int getX() {
  return x;
}
public void setX(int x) {
  this.x = x;
}
public int getY() {
  return y;
}
public void setY(int y) {
  this.y = y;
}
public PointBean(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}
public PointBean() {
  super();
}
@Override
public String toString() {
  return "PointBean [x=" + x + ", y=" + y + "]";
}
}

KNN算法

package KNN;
import java.util.ArrayList;
/**
 * KNN實(shí)現(xiàn)的方法
 * @author Administrator
 *
 */
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());
    // 找出最小的距離
    for(int i=1;i<list.size();i++){
      if(temp<((b_x -list.get(i).getX())*(b_x -list.get(i).getX())+
          (b_y -list.get(i).getY())*(b_y -list.get(i).getY()))){
        temp=(b_x -list.get(i).getX())*(b_x -list.get(i).getX())+
            (b_y -list.get(i).getY())*(b_y -list.get(i).getY());
      }
    }
    return Math.sqrt(temp);
  }
  /**
   * 獲取長度,找出最小的一個(gè)進(jìn)行歸類
   * @param list1
   * @param list2
   * @param list3
   * @param bb
   */
  public void getContent(ArrayList<PointBean> list1,ArrayList<PointBean> list2,
      ArrayList<PointBean> list3,PointBean bb){
    double A=getPointLength(list1,bb);
    double B=getPointLength(list2,bb);
    double C=getPointLength(list3,bb);
    //做出比較
    if(A>B){
      if(B>C){
        System.out.println("這個(gè)點(diǎn):"+bb.getX()+" , "+bb.getY()+" " +"屬于C");
      }else {
        System.out.println("這個(gè)點(diǎn):"+bb.getX()+" , "+bb.getY()+" " +"屬于B");
      }
    }else {
      if(A>C){
        System.out.println("這個(gè)點(diǎn):"+bb.getX()+" , "+bb.getY()+" " +"屬于C");
      }else {
        System.out.println("這個(gè)點(diǎn):"+bb.getX()+" , "+bb.getY()+" " +"屬于A");
      }
    }
  }
}

主函數(shù)

package KNN;
import java.util.ArrayList;
/*
 * 主函數(shù) 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) {
    //創(chuàng)佳Arraylist
    listA=new ArrayList<PointBean>();
    listB=new ArrayList<PointBean>();
    listC=new ArrayList<PointBean>();
    listD=new ArrayList<PointBean>();
    //寫入數(shù)據(jù)
    setDate();
    getTestResult();
  }
  /**
   * 得到結(jié)果
   */
  private static void getTestResult() {
    //創(chuàng)建對象
    KnnMain km=new KnnMain();
    for(int i=0;i<listD.size();i++){
      km.getContent(listA, listB, listC, listD.get(i));
    }
  }
  /**
   * 寫入數(shù)據(jù)
   */
  private static void setDate() {
    //A的坐標(biāo)點(diǎn)
    int A_x[]={1,1,2,2,1};
    int A_y[]={0,1,1,0,2};
    //B的坐標(biāo)點(diǎn)
    int B_x[]={2,3,3,3,4};
    int B_y[]={4,4,3,2,3};
    //C的坐標(biāo)點(diǎn)
    int C_x[]={4,5,5,6,6};
    int C_y[]={1,2,0,2,1};
    // 測試數(shù)據(jù)
    //B的坐標(biāo)點(diǎn)
    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);
    }
  }
}

測試的結(jié)果:

這個(gè)點(diǎn):3 , 1 屬于A
這個(gè)點(diǎn):3 , 5 屬于B
這個(gè)點(diǎn):0 , 0 屬于A
這個(gè)點(diǎn):5 , 1 屬于C

到此簡單的KNN算法已經(jīng)實(shí)現(xiàn)對于未知點(diǎn)的劃分,有助于大家對于KNN算法的理解。對于改進(jìn)KNN的一些算法JAVA實(shí)現(xiàn)會(huì)在后面進(jìn)行貼出。共同學(xué)習(xí)共同進(jìn)步!

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • java數(shù)組基礎(chǔ)詳解

    java數(shù)組基礎(chǔ)詳解

    下面小編就為大家?guī)硪黄狫ava創(chuàng)建數(shù)組的幾種方式總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給大家?guī)韼椭?/div> 2021-06-06
  • 淺談Spring如何解決循環(huán)依賴的問題

    淺談Spring如何解決循環(huán)依賴的問題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù)

    SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù)

    這篇文章主要介紹了SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java Synchronized的偏向鎖詳細(xì)分析

    Java Synchronized的偏向鎖詳細(xì)分析

    synchronized作為Java程序員最常用同步工具,很多人卻對它的用法和實(shí)現(xiàn)原理一知半解,以至于還有不少人認(rèn)為synchronized是重量級鎖,性能較差,盡量少用。但不可否認(rèn)的是synchronized依然是并發(fā)首選工具,本文就來詳細(xì)講講
    2023-04-04
  • Java使用組件編寫窗口實(shí)現(xiàn)網(wǎng)上文件下載

    Java使用組件編寫窗口實(shí)現(xiàn)網(wǎng)上文件下載

    這篇文章主要為大家詳細(xì)介紹了Java使用組件編寫窗口實(shí)現(xiàn)網(wǎng)上文件下載的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Spring常用數(shù)據(jù)源的xml配置詳解

    Spring常用數(shù)據(jù)源的xml配置詳解

    這篇文章主要介紹了Spring常用數(shù)據(jù)源的xml配置詳解,數(shù)據(jù)源是連接到數(shù)據(jù)庫的一類路徑,它包含了訪問數(shù)據(jù)庫的信息(地址、用戶名、密碼),數(shù)據(jù)源就像是排水管道,需要的朋友可以參考下
    2023-07-07
  • Java的內(nèi)存分配與回收策略詳解

    Java的內(nèi)存分配與回收策略詳解

    這篇文章主要介紹了Java的內(nèi)存分配與回收策略詳解,對象的內(nèi)存分配,就是在堆上分配,對象主要分配在新生代的 Eden 區(qū)上,少數(shù)情況下可能直接分配在老年代,分配規(guī)則不固定,取決于當(dāng)前使用的垃圾收集器組合以及相關(guān)的參數(shù)配置,需要的朋友可以參考下
    2023-08-08
  • Java如何調(diào)用TSC打印機(jī)進(jìn)行打印詳解

    Java如何調(diào)用TSC打印機(jī)進(jìn)行打印詳解

    這篇文章主要給大家介紹了關(guān)于Java如何調(diào)用TSC打印機(jī)進(jìn)行打印的相關(guān)資料,文中介紹了三種方法,分別是兩種后臺(tái)打印以及JS打印 ,三種方法都給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-07-07
  • Mybatis Plus 3.4.0分頁攔截器的用法小結(jié)

    Mybatis Plus 3.4.0分頁攔截器的用法小結(jié)

    本文主要介紹了Mybatis Plus 3.4.0分頁攔截器的用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • spring boot整合shiro安全框架過程解析

    spring boot整合shiro安全框架過程解析

    這篇文章主要介紹了spring boot整合shiro安全框架過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評論

桐梓县| 潢川县| 清河县| 临猗县| 龙游县| 安新县| 金沙县| 巴里| 桓仁| 繁峙县| 清河县| 朝阳区| 鄯善县| 丹凤县| 江津市| 中阳县| 昭通市| 太和县| 岐山县| 东乡县| 曲阜市| 揭阳市| 察隅县| 平武县| 丘北县| 肥乡县| 武川县| 余干县| 宁阳县| 呈贡县| 崇仁县| 邵武市| 宾川县| 屯留县| 隆化县| 赣州市| 安西县| 桑日县| 普兰县| 灯塔市| 乌拉特前旗|