necesidad
Ejecute el algoritmo K-Means en un campo de una tabla en una base de datos MySQL y escriba los datos procesados en la nueva tabla.
Código fuente y controlador
kmeans_jb51.rar
Código fuente
import java.sql.*; import java.util.*;/***@Author TiAnshl*@Version 2018/1/13 11:13 am*/clase pública Kmeans {// Lista privada de datos de origen <Integer> origins = new ArrayList <> (); // Mapa privado de datos agrupados <doble, lista <integer>> agrupada; // Lista de centroides inicial Lista privada <doble> núcleos; // Fuente de datos Cadena privada TableName; cadena privada colname; / *** Método del constructor** @param TableName Fuente Nombre de la tabla de datos* @param columna de datos de origen colname Nombre de la columna* @param Center of Mass List*/ Private Kmeans (String TableName, String Colname, List <Oble> CORES) {this.cores = cores; this.tableName = tableName; this.colname = colname; } / ** * Recalcule el centro de masa * * @return nueva lista de centroides * / private list <doble> newcores () {list <souble> newcores = new ArrayList <> (); para (list <Integer> v: grouped.values ()) {newcores.add (v.stream (). Reduce (0, (suma, num) -> suma + num) / (v.size () + 0.0)); } Colección.sort (Newcores); devolver Newcores; } / ** * Determine si termina * * @return bool * / private boolean isover () {list <souble> _cores = newcores (); para (int i = 0, len = cores.size (); i <len; i ++) {if (! Cores.get (i) .ToString (). Equals (_cores.get (i) .ToString ())) {// use nuevos núcleos centroides = _cores; devolver falso; }} return verdadero; } / *** agrupación de datos* / private void setGrouped () {agrupado = new HashMap <> (); Doble núcleo; para (origen entero: orígenes) {core = getCore (origen); if (! Grouped.ContainsKey (Core)) {Grouped.put (Core, New ArrayList <> ()); } agrupado.get (core) .add (origen); }} / *** Seleccione el centroide** @param los datos num se agruparán* @return centroid* / private double getCore (integer num) {// Lista de diferencia <doble> diffs = new ArrayList <> (); // Calcule la diferencia para (doble núcleo: núcleos) {diffs.add (math.abs (num - core)); } // diferencia mínima-> índice-> nores de retorno de centroides correspondientes.get (diffs.indexof (colección.in (diffs))); }/*** Establezca una conexión de base de datos* @return conexión*/private Connection getConn () {try {// El URL apunta al nombre de la base de datos a acceder a MyData String url = "jdbc: mysql: // localhost: 3306/data_analysis_dev"; // Nombre de usuario durante MySQL Configuration String user = "root"; // contraseña durante la cadena de configuración de MySQL contraseña = "root"; // cargar el controlador class.forname ("com.mysql.jdbc.driver"); // declarar el objeto de conexión Connection conn = drivermanager.getConnection (url, usuario, contraseña); if (conn.isClosed ()) {System.out.println ("¡Conexión a la base de datos fallida!"); regresar nulo; } System.out.println ("¡Conectarse con la base de datos con éxito!"); devolver Conn; } catch (Exception e) {System.out.println ("Conn Connection falló!"); E.PrintStackTrace (); } return null; } / *** Cierre la conexión de la base de datos** @param Connection Connection* / private void Close (Connection Conn) {try {if (conn! = Null &&! Conn.isClosed ()) conn.close (); } catch (Exception e) {E.PrintStackTrace (); }} / *** Obtener datos de origen* / private void getorigins () {Connection conn = null; intente {conn = getConn (); if (conn == null) return; Instrucción instrucción = conn.createStatement (); ResultSet rs = Declary.ExecuteQuery (String.Format ("Seleccionar %s de %s", colname, tableName)); while (rs.next ()) {Origins.Add (rs.getInt (1)); } conn.close (); } catch (Exception e) {E.PrintStackTrace (); } Finalmente {Close (Conn); }} / *** Escribir datos a la nueva tabla* / private void write () {Connection conn = null; intente {conn = getConn (); if (conn == null) return; // Declaración de Tabla Crear tabla = Conn.CreateStatement (); // Eliminar la declaración de tabla de datos anterior. // Crear nueva Tabla Declarat. // envío automático de conn.setAutOcommit (falso); Preparado Ps = Conn.PrepareStatement ("Insertar en valores de K_Means (?,?)"); para (map.entry <double, list <integer>> Entry: grouped.entryset ()) {double core = entry.getKey (); for (valor entero: entry.getValue ()) {ps.setDouble (1, core); Ps.SetInt (2, valor); Ps.Addbatch (); }} // ejecución por lotes de Ps.executeBatch (); // Conjunto de transacción conn.commit (); // Cerrar conexión conn.close (); } catch (Exception e) {E.PrintStackTrace (); } Finalmente {Close (Conn); }} / *** Datos de proceso* / private void run () {System.out.println ("Obtener datos de origen"); // Obtener datos de origen getorigins (); // deja de agrupar boolean isOver = false; System.out.println ("Procesamiento de agrupación de datos"); while (! Isover) {// Grouping de datos setGrouped (); // Determinar si para dejar de agrupar ISOVER = ISOVER (); } System.out.println ("Escribir datos procesados en la base de datos"); // Escribir datos agrupados en una nueva tabla Write (); System.out.println ("Escribir datos para completar"); } public static void main (string [] args) {list <souble> cores = new ArrayList <> (); nores.add (260.0); núcleos.add (600.0); // Nombre de la tabla, nombre de la columna, lista de centroides nuevos kmeans ("atributos", "att_length", núcleos) .run (); }}Archivo fuente
Kmeans.java
Compilación
Javac Kmeans.java
correr
# Especificar la biblioteca de dependencia java -djava.ext.dirs =./Lib kmeans
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.