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

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

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

需求

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

源碼及驅(qū)動

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;
  }

  /**
   * 重新計算質(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<>();

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

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

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

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

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

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

      return conn;

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

    return null;
  }

  /**
   * 關(guān)閉數(shù)據(jù)庫連接
   *
   * @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));");

      // 禁止自動提交
      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ù)庫");
    // 將分組數(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 

運行

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

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

相關(guān)文章

  • springBoot項目啟動類啟動無法訪問的解決方法

    springBoot項目啟動類啟動無法訪問的解決方法

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

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

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

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

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

    Java異常處理實例詳解

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

    5分鐘快速上手Spring Boot

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

    詳解Jackson 使用以及性能介紹

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

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

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

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

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

    JavaWeb建立簡單三層項目步驟圖解

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

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

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

最新評論

林口县| 塘沽区| 平武县| 建瓯市| 改则县| 武清区| 柳林县| 清水河县| 镇远县| 剑川县| 黄龙县| 宜君县| 张家川| 杂多县| 渭南市| 应城市| 福鼎市| 胶南市| 宕昌县| 西乡县| 岳阳市| 西丰县| 八宿县| 朝阳市| 从江县| 闻喜县| 莒南县| 昌吉市| 敦煌市| 莲花县| 沾益县| 西城区| 壤塘县| 班玛县| 鄂尔多斯市| 太湖县| 麻江县| 扶风县| 威信县| 安宁市| 宜章县|