java代码实现Kmeans聚类算法,训练集的文件类型为txt
时间: 2024-05-04 07:16:30 浏览: 19
KMeans聚类算法可以用Java编写,并可用于处理txt文件类型的训练集。您可以遵循以下步骤来实现:
1. 从txt文件读取训练集数据。
2. 随机选择K个点作为初始聚类中心。
3. 对于每个实例,计算其距离最近的聚类中心,并将其分配到该聚类。
4. 重新计算每个聚类的中心点。
5. 重复步骤3和4,直到聚类中心不再改变或达到最大迭代次数。
下面是Java代码的示例实现:
```java
public class KMeans {
private int k; //聚类数
private int iterNum; //最大迭代次数
private int[] labels; //每个实例所属的聚类编号
private double[][] centers; //聚类中心点
private double[][] data; //存储训练集数据
public KMeans(int k, int iterNum, double[][] data) {
this.k = k;
this.iterNum = iterNum;
this.data = data;
this.labels = new int[data.length];
this.centers = new double[k][data[0].length];
}
//初始化聚类中心点
private void initCenters() {
Random r = new Random();
int[] indices = new int[k];
for (int i = 0; i < k; i++) {
int index;
do {
index = r.nextInt(data.length);
} while (ArrayUtils.contains(indices, index));
indices[i] = index;
centers[i] = data[index];
}
}
//计算两个实例之间的欧几里得距离
private double distance(double[] a, double[] b) {
double sum = 0;
for (int i = 0; i < a.length; i++) {
sum += Math.pow(a[i] - b[i], 2);
}
return Math.sqrt(sum);
}
//计算每个实例距离最近的聚类中心,并将其分配到该聚类
private void assignLabels() {
for (int i = 0; i < data.length; i++) {
double minDist = Double.MAX_VALUE;
for (int j = 0; j < centers.length; j++) {
double dist = distance(data[i], centers[j]);
if (dist < minDist) {
minDist = dist;
labels[i] = j;
}
}
}
}
//重新计算每个聚类的中心点
private void updateCenters() {
double[][] sums = new double[k][data[0].length];
int[] counts = new int[k];
for (int i = 0; i < data.length; i++) {
int label = labels[i];
for (int j = 0; j < data[i].length; j++) {
sums[label][j] += data[i][j];
}
counts[label]++;
}
for (int i = 0; i < centers.length; i++) {
for (int j = 0; j < centers[i].length; j++) {
if (counts[i] > 0) {
centers[i][j] = sums[i][j] / counts[i];
}
}
}
}
//运行KMeans算法
public void run() {
initCenters(); //初始化聚类中心点
for (int i = 0; i < iterNum; i++) {
assignLabels(); //计算每个实例距离最近的聚类中心
updateCenters(); //重新计算每个聚类的中心点
}
}
//获取每个实例所属的聚类编号
public int[] getLabels() {
return labels;
}
//获取聚类中心点
public double[][] getCenters() {
return centers;
}
//测试
public static void main(String[] args) throws Exception {
int k = 3; //设置聚类数为3
int iterNum = 100; //设置最大迭代次数为100
String filePath = "data.txt"; //训练集数据文件路径
double[][] data = loadData(filePath); //从txt文件中读取训练集数据
KMeans kmeans = new KMeans(k, iterNum, data);
kmeans.run(); //运行KMeans算法
double[][] centers = kmeans.getCenters();
for (int i = 0; i < centers.length; i++) {
System.out.println("Cluster " + i + ": " + Arrays.toString(centers[i]));
}
int[] labels = kmeans.getLabels();
for (int i = 0; i < labels.length; i++) {
System.out.println("Instance " + i + " belongs to Cluster " + labels[i]);
}
}
//从txt文件中读取训练集数据
private static double[][] loadData(String filePath) throws Exception {
List<String> lines = FileUtils.readLines(new File(filePath), "UTF-8");
double[][] data = new double[lines.size()][];
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);
String[] parts = line.split(",");
double[] instance = new double[parts.length];
for (int j = 0; j < parts.length; j++) {
instance[j] = Double.parseDouble(parts[j]);
}
data[i] = instance;
}
return data;
}
}
```
该示例代码中,训练集数据保存在一个txt文件中,每行数据以逗号分隔。您可以将数据按您的需求格式化到一个txt文件中。然后,您可以通过调用KMeans对象的run()方法来运行KMeans聚类算法,该方法会返回每个实例所属的聚类编号和聚类中心点。您也可以对代码进行修改,以便将实现KMeans算法的过程封装到一个函数中,使其更易于使用。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)