生活随笔
收集整理的這篇文章主要介紹了
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];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
};void generatePoints() {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
);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));}}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
++) {dx
= points
[i
][0] - centers
[j
][0];dy
= points
[i
][1] - centers
[j
][1];distances
[i
][j
] = dx
* dx
+ dy
* dy
;}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;for (int i
= 0; i
< N
; i
++) {if (kinds
[i
] == j
) {centers
[j
][0] += points
[i
][0];centers
[j
][1] += points
[i
][1];count
++;}}centers
[j
][0] /= count
;centers
[j
][1] /= count
;}}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);}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
++) { kMeans
.plot();kMeans
.assignPoints();kMeans
.calcCenters();Thread
.sleep(500); }}
}
總結
以上是生活随笔為你收集整理的Java实例_综合实践3.K-Means聚类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。