栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

K均值聚类算法的Java版实现代码示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

K均值聚类算法的Java版实现代码示例

1.简介

K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

2.什么是聚类

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。

3.什么是k均值聚类

k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。

4.实现

Java代码如下:

package org.algorithm;
import java.util.ArrayList;
import java.util.Random;

public class Kmeans {
	private int k;
	// 分成多少簇 
	private int m;
	// 迭代次数 
	private int dataSetLength;
	// 数据集元素个数,即数据集的长度 
	private ArrayList dataSet;
	// 数据集链表 
	private ArrayList center;
	// 中心链表 
	private ArrayList> cluster;
	// 簇 
	private ArrayList jc;
	// 误差平方和,k越接近dataSetLength,误差越小 
	private Random random;
	
	public void setDataSet(ArrayList dataSet) {
		this.dataSet = dataSet;
	}
	
	public ArrayList> getCluster() {
		return cluster;
	}
	
	public Kmeans(int k) {
		if (k <= 0) {
			k = 1;
		}
		this.k = k;
	}
	
	private void init() {
		m = 0;
		random = new Random();
		if (dataSet == null || dataSet.size() == 0) {
			initDataSet();
		}
		dataSetLength = dataSet.size();
		if (k > dataSetLength) {
			k = dataSetLength;
		}
		center = initCenters();
		cluster = initCluster();
		jc = new ArrayList();
	}
	
	private void initDataSet() {
		dataSet = new ArrayList();
		// 其中{6,3}是一样的,所以长度为15的数据集分成14簇和15簇的误差都为0 
		float[][] dataSetArray = new float[][] { { 8, 2 }, { 3, 4 }, { 2, 5 }, 
		 { 4, 2 }, { 7, 3 }, { 6, 2 }, { 4, 7 }, { 6, 3 }, { 5, 3 }, 
		 { 6, 3 }, { 6, 9 }, { 1, 6 }, { 3, 9 }, { 4, 1 }, { 8, 6 } };
		for (int i = 0; i < dataSetArray.length; i++) {
			dataSet.add(dataSetArray[i]);
		}
	}
	
	private ArrayList initCenters() {
		ArrayList center = new ArrayList();
		int[] randoms = new int[k];
		Boolean flag;
		int temp = random.nextint(dataSetLength);
		randoms[0] = temp;
		for (int i = 1; i < k; i++) {
			flag = true;
			while (flag) {
				temp = random.nextint(dataSetLength);
				int j = 0;
				// 不清楚for循环导致j无法加1 
				// for(j=0;j

5.说明:

具体代码是从网上找的,根据自己的理解加了注释和进行部分修改,若注释有误还望指正

6.测试

package org.test;
import java.util.ArrayList;
import org.algorithm.Kmeans;
public class KmeansTest {
	public static void main(String[] args) 
	  {
		//初始化一个Kmean对象,将k置为10 
		Kmeans k=new Kmeans(10);
		ArrayList dataSet=new ArrayList();
		dataSet.add(new float[]{1,2});
		dataSet.add(new float[]{3,3});
		dataSet.add(new float[]{3,4});
		dataSet.add(new float[]{5,6});
		dataSet.add(new float[]{8,9});
		dataSet.add(new float[]{4,5});
		dataSet.add(new float[]{6,4});
		dataSet.add(new float[]{3,9});
		dataSet.add(new float[]{5,9});
		dataSet.add(new float[]{4,2});
		dataSet.add(new float[]{1,9});
		dataSet.add(new float[]{7,8});
		//设置原始数据集 
		k.setDataSet(dataSet);
		//执行算法 
		k.execute();
		//得到聚类结果 
		ArrayList> cluster=k.getCluster();
		//查看结果 
		for (int i=0;i

总结:测试代码已经通过。并对聚类的结果进行了查看,结果基本上符合要求。至于有没有更精确的算法有待发现。具体的实践还有待挖掘

总结

以上就是本文关于K均值聚类算法的Java版实现代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142695.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号