K-Means 聚类算法 Java 实现154
K-Means 聚类算法是一种无监督机器学习算法,用于将数据样本划分为 k 个簇或组。它是一种简单且流行的算法,在各种实际应用中都有着广泛的应用,例如图像分割、文本挖掘和客户细分。
算法描述
K-Means 聚类算法的工作原理如下:
随机初始化:从数据集中随机选择 k 个点作为初始簇中心。
分配簇:对于数据集中的每个数据点,计算其到每个簇中心的距离,并将其分配到距离最近的簇。
更新簇中心:重新计算每个簇中所有数据点的平均值,并将该平均值设置为新的簇中心。
重复步骤 2 和 3:重复步骤 2 和 3,直到簇中心不再变化或达到最大迭代次数。
此过程会收敛到数据集的局部最优解,其中数据点被分配到 k 个簇,使得簇内距离最小化,而簇间距离最大化。
Java 实现
以下 Java 代码展示了如何实现 K-Means 聚类算法:```java
import .*;
public class KMeans {
private int k; // 簇数
private List points; // 数据点集合
private List centroids; // 簇中心集合
public KMeans(int k, List points) {
this.k = k;
= points;
}
public void cluster() {
// 随机初始化簇中心
centroids = new ArrayList();
for (int i = 0; i < k; i++) {
((new Random().nextInt(())));
}
// 重复分配簇和更新簇中心,直到收敛
boolean converged = false;
int iterations = 0;
while (!converged && iterations < 100) {
// 分配簇
for (Point point : points) {
double minDistance = Double.MAX_VALUE;
int closestCentroidIndex = -1;
for (int i = 0; i < k; i++) {
double distance = ((i));
if (distance < minDistance) {
minDistance = distance;
closestCentroidIndex = i;
}
}
(closestCentroidIndex);
}
// 更新簇中心
for (int i = 0; i < k; i++) {
List clusterPoints = new ArrayList();
for (Point point : points) {
if (() == i) {
(point);
}
}
Point newCentroid = (clusterPoints);
(i, newCentroid);
}
converged = true;
for (int i = 0; i < k; i++) {
if (!(i).equals((i))) {
converged = false;
}
}
iterations++;
}
}
public List getClusters() {
List clusters = new ArrayList();
for (int i = 0; i < k; i++) {
List cluster = new ArrayList();
for (Point point : points) {
if (() == i) {
(point);
}
}
(cluster);
}
return clusters;
}
}
```
在这个实现中,Point类表示一个数据点,distanceTo()方法计算两个点之间的距离,average()方法计算一个数据点集合的平均值。可以通过调用cluster()方法运行聚类算法,并通过调用getClusters()方法获取聚类结果。
K-Means 聚类算法是一种简单且有效的算法,用于将数据集划分为不同的簇。它在 Java 中的实现相对简单,可以通过使用此代码在各种应用中轻松地执行聚类任务。
2024-11-23
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