K-Means算法Java实现266
K-Means算法是一种无监督机器学习算法,用于将数据点聚类为k个簇。它广泛用于图像分割、自然语言处理和客户细分等领域。以下是K-Means算法的基本原理和Java代码实现。
K-Means算法
K-Means算法通过迭代地更新簇中心和将数据点分配到最近的簇中心来工作。算法步骤如下:1. 初始化簇中心:随机选择k个数据点作为初始簇中心。
2. 分配数据点:将每个数据点分配到最近的簇中心。
3. 更新簇中心:计算每个簇中数据点的平均值,并将其作为新的簇中心。
4. 重复步骤2和3:直到簇中心不再发生变化或达到最大迭代次数。
Java代码实现
以下是K-Means算法的Java代码实现:```java
import .*;
public class KMeans {
// 聚类中心
private Point[] centroids;
// 数据点
private Point[] dataPoints;
// 簇分配
private int[] assignments;
// 簇误差平方和(SSE)
private double sse;
public KMeans(int k, Point[] dataPoints) {
= new Point[k];
= dataPoints;
= new int[];
= 0;
}
public void run(int maxIterations) {
// 随机初始化簇中心
initializeCentroids();
for (int i = 0; i < maxIterations; i++) {
// 分配数据点
assignDataPoints();
// 更新簇中心
updateCentroids();
// 计算SSE
calculateSSE();
}
}
private void initializeCentroids() {
Random random = new Random();
for (int i = 0; i < ; i++) {
centroids[i] = dataPoints[()];
}
}
private void assignDataPoints() {
for (int i = 0; i < ; i++) {
double minDistance = Double.MAX_VALUE;
int minCluster = -1;
for (int j = 0; j < ; j++) {
double distance = dataPoints[i].distance(centroids[j]);
if (distance < minDistance) {
minDistance = distance;
minCluster = j;
}
}
assignments[i] = minCluster;
}
}
private void updateCentroids() {
for (int i = 0; i < ; i++) {
List pointsInCluster = new ArrayList();
for (int j = 0; j < ; j++) {
if (assignments[j] == i) {
(dataPoints[j]);
}
}
// 计算簇中心
centroids[i] = (pointsInCluster);
}
}
private void calculateSSE() {
sse = 0;
for (int i = 0; i < ; i++) {
double distance = dataPoints[i].distance(centroids[assignments[i]]);
sse += distance * distance;
}
}
public Point[] getCentroids() {
return centroids;
}
public int[] getAssignments() {
return assignments;
}
public double getSSE() {
return sse;
}
}
```
示例用法
要使用K-Means算法,可以创建KMeans对象,指定要创建的簇数目和要聚类的数据点。然后调用run()方法运行算法。聚类结果可以通过getCentroids()、getAssignments()和getSSE()方法获得。```java
// 示例用法
Point[] dataPoints = ... // 数据点
int k = 3; // 簇数
KMeans kMeans = new KMeans(k, dataPoints);
(100);
// 输出聚类结果
("Cluster centers:");
for (Point centroid : ()) {
(centroid);
}
("Assignments:");
for (int assignment : ()) {
(assignment);
}
("SSE: " + ());
```
K-Means算法是一种简单而有效的聚类算法,广泛用于各种领域。通过提供Java代码实现,本文展示了如何轻松地实现该算法并将其应用于实际数据。
2024-12-09
Java方法栈日志的艺术:从错误定位到性能优化的深度指南
https://www.shuihudhg.cn/133725.html
PHP 获取本机端口的全面指南:实践与技巧
https://www.shuihudhg.cn/133724.html
Python内置函数:从核心原理到高级应用,精通Python编程的基石
https://www.shuihudhg.cn/133723.html
Java Stream转数组:从基础到高级,掌握高性能数据转换的艺术
https://www.shuihudhg.cn/133722.html
深入解析:基于Java数组构建简易ATM机系统,从原理到代码实践
https://www.shuihudhg.cn/133721.html
热门文章
Java中数组赋值的全面指南
https://www.shuihudhg.cn/207.html
JavaScript 与 Java:二者有何异同?
https://www.shuihudhg.cn/6764.html
判断 Java 字符串中是否包含特定子字符串
https://www.shuihudhg.cn/3551.html
Java 字符串的切割:分而治之
https://www.shuihudhg.cn/6220.html
Java 输入代码:全面指南
https://www.shuihudhg.cn/1064.html