K-Means聚类算法 Java 代码详解228


K-Means聚类是机器学习中广泛使用的无监督学习算法,用于将数据点划分到K个不同的组(集群)中。它通过最小化每个数据点到其分配集群中心的距离来工作。

以下 Java 代码提供了对 K-Means 聚类算法的完整实现:```java
import .*;
public class KMeansClustering {
private int k; // 集群数
private int maxIterations; // 最大迭代次数
private double[][] data; // 数据点
private int[] clusterAssignments; // 数据点的集群分配
public KMeansClustering(int k, int maxIterations, double[][] data) {
this.k = k;
= maxIterations;
= data;
= new int[];
}
public void run() {
// 随机初始化集群中心
double[][] centroids = initializeCentroids();
// 迭代聚类过程
for (int iteration = 0; iteration < maxIterations; iteration++) {
// 为每个数据点分配离其最近的集群中心
assignClusters(centroids);
// 更新集群中心
updateCentroids();
// 检查是否收敛
if (hasConverged()) {
break;
}
}
}
private double[][] initializeCentroids() {
// 从数据点中随机选择 K 个点作为初始集群中心
double[][] centroids = new double[k][data[0].length];
for (int i = 0; i < k; i++) {
int index = new Random().nextInt();
centroids[i] = data[index];
}
return centroids;
}
private void assignClusters(double[][] centroids) {
// 为每个数据点找到距离它最近的集群中心
for (int i = 0; i < ; i++) {
double minDistance = Double.MAX_VALUE;
int assignedCluster = -1;
for (int j = 0; j < k; j++) {
double distance = calculateDistance(data[i], centroids[j]);
if (distance < minDistance) {
minDistance = distance;
assignedCluster = j;
}
}
clusterAssignments[i] = assignedCluster;
}
}
private void updateCentroids() {
// 为每个集群计算新的中心
for (int j = 0; j < k; j++) {
double[] newCentroid = new double[data[0].length];
int count = 0;
for (int i = 0; i < ; i++) {
if (clusterAssignments[i] == j) {
for (int l = 0; l < data[0].length; l++) {
newCentroid[l] += data[i][l];
}
count++;
}
}
for (int l = 0; l < data[0].length; l++) {
newCentroid[l] /= count;
}
centroids[j] = newCentroid;
}
}
private boolean hasConverged() {
// 检查集群中心是否不再变化
boolean converged = true;
for (int j = 0; j < k; j++) {
for (int l = 0; l < data[0].length; l++) {
if ((centroids[j][l] - newCentroids[j][l]) > 0.001) {
converged = false;
break;
}
}
}
return converged;
}
private double calculateDistance(double[] dataPoint, double[] centroid) {
// 计算数据点和集群中心之间的欧几里得距离
double distance = 0.0;
for (int i = 0; i < ; i++) {
distance += (dataPoint[i] - centroid[i], 2);
}
return (distance);
}
public int[] getClusterAssignments() {
// 返回数据点的集群分配
return clusterAssignments;
}
}
```

使用此代码,您可以实现 K-Means 聚类算法并将其应用于您的数据集。通过指定 K 聚类数、最大迭代次数和数据点列表,您可以运行聚类过程并获取数据点的集群分配。

2024-12-09


上一篇:Java 数独求解器:深入浅出从入门到精通

下一篇:Java 代码优化:释放代码潜力的实用工具