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 代码质量检查:提高代码可靠性和可维护性

下一篇:正则表达式在 Java 中提取字符串