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

詳解Java實(shí)現(xiàn)的k-means聚類算法

 更新時(shí)間:2018年01月13日 15:46:25   作者:tianshl  
這篇文章主要介紹了詳解Java實(shí)現(xiàn)的k-means聚類算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

需求

對(duì)MySQL數(shù)據(jù)庫(kù)中某個(gè)表的某個(gè)字段執(zhí)行k-means算法,將處理后的數(shù)據(jù)寫入新表中。

源碼及驅(qū)動(dòng)

kmeans_jb51.rar

源碼

import java.sql.*;
import java.util.*;

/**
 * @author tianshl
 * @version 2018/1/13 上午11:13
 */
public class Kmeans {
  // 源數(shù)據(jù)
  private List<Integer> origins = new ArrayList<>();

  // 分組數(shù)據(jù)
  private Map<Double, List<Integer>> grouped;

  // 初始質(zhì)心列表
  private List<Double> cores;

  // 數(shù)據(jù)源
  private String tableName;
  private String colName;

  /**
   * 構(gòu)造方法
   *
   * @param tableName 源數(shù)據(jù)表名稱
   * @param colName  源數(shù)據(jù)列名稱
   * @param cores   質(zhì)心列表
   */
  private Kmeans(String tableName, String colName,List<Double> cores){
    this.cores = cores;
    this.tableName = tableName;
    this.colName = colName;
  }

  /**
   * 重新計(jì)算質(zhì)心
   *
   * @return 新的質(zhì)心列表
   */
  private List<Double> newCores(){
    List<Double> newCores = new ArrayList<>();

    for(List<Integer> v: grouped.values()){
      newCores.add(v.stream().reduce(0, (sum, num) -> sum + num) / (v.size() + 0.0));
    }

    Collections.sort(newCores);
    return newCores;
  }

  /**
   * 判斷是否結(jié)束
   *
   * @return bool
   */
  private Boolean isOver(){
    List<Double> _cores = newCores();
    for(int i=0, len=cores.size(); i<len; i++){
      if(!cores.get(i).toString().equals(_cores.get(i).toString())){
        // 使用新質(zhì)心
        cores = _cores;
        return false;
      }
    }
    return true;
  }

  /**
   * 數(shù)據(jù)分組
   */
  private void setGrouped(){
    grouped = new HashMap<>();

    Double core;
    for (Integer origin: origins) {
      core = getCore(origin);

      if (!grouped.containsKey(core)) {
        grouped.put(core, new ArrayList<>());
      }

      grouped.get(core).add(origin);
    }
  }

  /**
   * 選擇質(zhì)心
   *
   * @param num  要分組的數(shù)據(jù)
   * @return   質(zhì)心
   */
  private Double getCore(Integer num){

    // 差 列表
    List<Double> diffs = new ArrayList<>();

    // 計(jì)算差
    for(Double core: cores){
      diffs.add(Math.abs(num - core));
    }

    // 最小差 -> 索引 -> 對(duì)應(yīng)的質(zhì)心
    return cores.get(diffs.indexOf(Collections.min(diffs)));
  }

  /**
   * 建立數(shù)據(jù)庫(kù)連接
   * @return connection
   */
  private Connection getConn(){
    try {
      // URL指向要訪問(wèn)的數(shù)據(jù)庫(kù)名mydata
      String url = "jdbc:mysql://localhost:3306/data_analysis_dev";
      // MySQL配置時(shí)的用戶名
      String user = "root";
      // MySQL配置時(shí)的密碼
      String password = "root";

      // 加載驅(qū)動(dòng)
      Class.forName("com.mysql.jdbc.Driver");

      //聲明Connection對(duì)象
      Connection conn = DriverManager.getConnection(url, user, password);

      if(conn.isClosed()){
        System.out.println("連接數(shù)據(jù)庫(kù)失敗!");
        return null;
      }
      System.out.println("連接數(shù)據(jù)庫(kù)成功!");

      return conn;

    } catch (Exception e) {
      System.out.println("連接數(shù)據(jù)庫(kù)失??!");
      e.printStackTrace();
    }

    return null;
  }

  /**
   * 關(guān)閉數(shù)據(jù)庫(kù)連接
   *
   * @param conn 連接
   */
  private void close(Connection conn){
    try {
      if(conn != null && !conn.isClosed()) conn.close();
    } catch (Exception e){
      e.printStackTrace();
    }
  }

  /**
   * 獲取源數(shù)據(jù)
   */
  private void getOrigins(){

    Connection conn = null;
    try {
      conn = getConn();
      if(conn == null) return;

      Statement statement = conn.createStatement();

      ResultSet rs = statement.executeQuery(String.format("select %s from %s", colName, tableName));

      while(rs.next()){
        origins.add(rs.getInt(1));
      }
      conn.close();
    } catch (Exception e){
      e.printStackTrace();
    } finally {
     close(conn);
    }
  }

  /**
   * 向新表中寫數(shù)據(jù)
   */
  private void write(){

    Connection conn = null;
    try {
      conn = getConn();
      if(conn == null) return;
      
      // 創(chuàng)建表
      Statement statement = conn.createStatement();

      // 刪除舊數(shù)據(jù)表
      statement.execute("DROP TABLE IF EXISTS k_means; ");
      // 創(chuàng)建新表
      statement.execute("CREATE TABLE IF NOT EXISTS k_means(`core` DECIMAL(11, 7), `col` INTEGER(11));");

      // 禁止自動(dòng)提交
      conn.setAutoCommit(false);

      PreparedStatement ps = conn.prepareStatement("INSERT INTO k_means VALUES (?, ?)");

      for(Map.Entry<Double, List<Integer>> entry: grouped.entrySet()){
        Double core = entry.getKey();
        for(Integer value: entry.getValue()){
          ps.setDouble(1, core);
          ps.setInt(2, value);
          ps.addBatch();
        }
      }

      // 批量執(zhí)行
      ps.executeBatch();

      // 提交事務(wù)
      conn.commit();

      // 關(guān)閉連接
      conn.close();
    } catch (Exception e){
      e.printStackTrace();
    } finally {
      close(conn);
    }
  }

  /**
   * 處理數(shù)據(jù)
   */
  private void run(){
    System.out.println("獲取源數(shù)據(jù)");
    // 獲取源數(shù)據(jù)
    getOrigins();

    // 停止分組
    Boolean isOver = false;

    System.out.println("數(shù)據(jù)分組處理");
    while(!isOver) {
      // 數(shù)據(jù)分組
      setGrouped();
      // 判斷是否停止分組
      isOver = isOver();
    }

    System.out.println("將處理好的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)");
    // 將分組數(shù)據(jù)寫入新表
    write();

    System.out.println("寫數(shù)據(jù)完畢");
  }

  public static void main(String[] args){
    List<Double> cores = new ArrayList<>();
    cores.add(260.0);
    cores.add(600.0);
    // 表名, 列名, 質(zhì)心列表
    new Kmeans("attributes", "attr_length", cores).run();
  }
}

源文件

Kmeans.java

編譯

javac Kmeans.java 

運(yùn)行

# 指定依賴庫(kù)
java -Djava.ext.dirs=./lib Kmeans

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springBoot項(xiàng)目啟動(dòng)類啟動(dòng)無(wú)法訪問(wèn)的解決方法

    springBoot項(xiàng)目啟動(dòng)類啟動(dòng)無(wú)法訪問(wèn)的解決方法

    這篇文章主要介紹了springBoot項(xiàng)目啟動(dòng)類啟動(dòng)無(wú)法訪問(wèn)的解決方法,需要的朋友可以參考下
    2018-10-10
  • VSCode搭建Java開(kāi)發(fā)環(huán)境的超詳細(xì)步驟

    VSCode搭建Java開(kāi)發(fā)環(huán)境的超詳細(xì)步驟

    VSCode是一款多平臺(tái)的源代碼編輯器,支持多種編程語(yǔ)言,它輕量級(jí)、功能強(qiáng)大,通過(guò)豐富的插件生態(tài)系統(tǒng)可以支持更多語(yǔ)言和運(yùn)行時(shí),如C++、C#、Java、Python等,這篇文章主要介紹了VSCode搭建Java開(kāi)發(fā)環(huán)境的超詳細(xì)步驟,需要的朋友可以參考下
    2024-10-10
  • java使用IO流對(duì)數(shù)組排序?qū)嵗v解

    java使用IO流對(duì)數(shù)組排序?qū)嵗v解

    在本篇文章里小編給大家整理的是一篇關(guān)于java使用IO流對(duì)數(shù)組排序?qū)嵗v解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • Java異常處理實(shí)例詳解

    Java異常處理實(shí)例詳解

    這篇文章主要介紹了Java異常處理實(shí)例詳解,列舉了實(shí)際例子講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • 5分鐘快速上手Spring Boot

    5分鐘快速上手Spring Boot

    這篇文章主要介紹了5分鐘快速上手Spring Boot,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解Jackson 使用以及性能介紹

    詳解Jackson 使用以及性能介紹

    這篇文章主要介紹了詳解Jackson 使用以及性能介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 一文詳細(xì)springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的整合步驟

    一文詳細(xì)springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的整合步驟

    Spring Boot可以很方便地與MySQL數(shù)據(jù)庫(kù)進(jìn)行整合,下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的整合步驟,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 初學(xué)者,Spring快速入門

    初學(xué)者,Spring快速入門

    本文主要講解了Spring框架的基礎(chǔ)知識(shí),Spring是一個(gè)輕量級(jí)的開(kāi)源框架,它是為簡(jiǎn)化企業(yè)級(jí)應(yīng)用開(kāi)發(fā)而生。文中運(yùn)用代碼非常詳細(xì)的介紹了相關(guān)知識(shí),需要了解的小伙伴可以參考一下哦
    2021-09-09
  • JavaWeb建立簡(jiǎn)單三層項(xiàng)目步驟圖解

    JavaWeb建立簡(jiǎn)單三層項(xiàng)目步驟圖解

    這篇文章主要介紹了JavaWeb建立簡(jiǎn)單三層項(xiàng)目步驟圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換

    java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換

    這篇文章主要介紹了java中String,數(shù)組,ArrayList三者之間的轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

阿勒泰市| 汶川县| 邢台市| 原平市| 英吉沙县| 涟源市| 漠河县| 定西市| 八宿县| 桐乡市| 文山县| 阳城县| 大冶市| 宝鸡市| 敖汉旗| 蒲江县| 庄浪县| 珲春市| 武城县| 蛟河市| 寿光市| 晋宁县| 临泽县| 通化县| 延津县| 尉犁县| 通化市| 林甸县| 峡江县| 永城市| 柳州市| 新宁县| 涿鹿县| 沁水县| 手游| 东丰县| 乌拉特后旗| 丰县| 建平县| 营口市| 绥滨县|