日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java实例_综合实践3.K-Means聚类算法

發布時間:2025/3/8 java 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实例_综合实践3.K-Means聚类算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編寫程序實現K-Means聚類算法 (見圖 4-12)。 K-Means是一種聚類算法,后者屬于機器學習中的無監督學習,用于識別給定數據集 中的若干數據簇——即每個數據所屬的分類。

K-Means算法的主要思想如下:
(1) 任選數據集中的K個數據點作為 K個分類的初始質心 (幾何中心),其中K為數據 的總分類數,由人通過觀察整個數據集的分布而事先確定。
(2) 將每個數據點指派到離其最近的質心所屬的分類。
(3) 重新計算每個分類的質心。
(4) 重復 (2)、(3),直至達到最大迭代次數或所有分類的質心不再變化

import java.awt.Color; import java.awt.Graphics; import java.util.Random;import javax.swing.JFrame;public class KMeans {int N = 300; // 數據點個數int K = 3;// 分類數double[][] points = new double[N][2];// 數據點(2列分別表示x、y坐標)double[][] centers = new double[K][2];// 分類質心double[][] distances = new double[N][K];// 數據點到分類質心的距離int[] kinds = new int[N];// 數據點所屬的分類JFrame win; // 用于呈現分類結果的窗口final int WIN_HEIGHT = 420;// 窗口高度final int WIN_WIDTH = 600;// 窗口寬度// 分類標記和顏色final String[] MARKER_TEXTS = { "X", "O", "+" };final Color[] MARKER_COLORS = { Color.RED, Color.MAGENTA, Color.BLUE };// 圍繞給定的K個點隨機產生N個數據點void generatePoints() {// 給定K個點的坐標double[][] ps = { { 300, 50 }, { 480, 300 }, { 120, 200 } }; Random r = new Random();// 隨機數對象int p; for (int i = 0; i < N; i++) {p = r.nextInt(K);// 隨機選擇一個給定的點// 圍繞點p隨機產生一個數據點points[i][0] = ps[p][0] + (r.nextBoolean() ? r.nextInt(100) : -r.nextInt(100));points[i][1] = ps[p][1] + (r.nextBoolean() ? r.nextInt(50) : -r.nextInt(50));}}// 選擇K個數據點作為K個分類的初始質心void initCenters() {for (int i = 0; i < K; i++) {centers[i][0] = points[i * N / K][0];centers[i][1] = points[i * N / K][1];}}// 對每個數據點,按離其最近的質心進行分類void assignPoints() {double dx, dy;double min;for (int i = 0; i < N; i++) {for (int j = 0; j < K; j++) {// 計算點i到K個質心的距離dx = points[i][0] - centers[j][0];dy = points[i][1] - centers[j][1];distances[i][j] = dx * dx + dy * dy;}// 選擇離其最近的質心作為點i所屬的分類min = distances[i][0];kinds[i] = 0;for (int j = 1; j < K; j++) {if (distances[i][j] < min) {min = distances[i][j];kinds[i] = j;}}}}// 根據所有點的分類,計算新的質心void calcCenters() {for (int j = 0; j < K; j++) {centers[j][0] = 0;centers[j][1] = 0;int count = 0;// 統計屬于分類j的點的個數for (int i = 0; i < N; i++) {if (kinds[i] == j) {centers[j][0] += points[i][0];centers[j][1] += points[i][1];count++;}}// 計算分類j的質心坐標(x、y的算術均值——K-Means算法名稱的由來)centers[j][0] /= count;centers[j][1] /= count;}}// 初始化UI(僅用于呈現結果)void initUI() {win = new JFrame("K-Means");win.setSize(WIN_WIDTH, WIN_HEIGHT);win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);win.setResizable(false);win.setVisible(true);}// 繪制N個數據點及K個質心(僅用于呈現結果)void plot() {Graphics g = win.getGraphics();g.clearRect(0, 0, WIN_WIDTH, WIN_HEIGHT);// 清除之前繪制的點// 以不同標記和顏色繪制各分類中的點for (int i = 0; i < N; i++) {g.setColor(MARKER_COLORS[kinds[i]]);g.drawString(MARKER_TEXTS[kinds[i]], (int) points[i][0], (int) (WIN_HEIGHT - 20 - points[i][1]));}// 繪制各分類的質心for (int i = 0; i < K; i++) {g.setColor(Color.BLACK);g.drawString("★", (int) centers[i][0], (int) (WIN_HEIGHT - 20 - centers[i][1]));}}// 程序入口public static void main(String[] args) throws InterruptedException {KMeans kMeans = new KMeans();kMeans.generatePoints();kMeans.initCenters();kMeans.initUI();for (int i = 0; i < 10; i++) { // 迭代10次kMeans.plot();kMeans.assignPoints();kMeans.calcCenters();Thread.sleep(500); // 暫停0.5秒(便于觀察迭代過程)}} }

總結

以上是生活随笔為你收集整理的Java实例_综合实践3.K-Means聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。