算法——K均值聚类算法(Java实现)

1、用途:聚类算法通常用于数据挖掘,将相似的数组进行聚簇

2、原理:网上比较多,可以百度或者google一下

3、实现:Java代码如下

package org.algorithm;

import java.util.ArrayList;
import java.util.Random;

/**
 * K均值聚类算法
 */
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;

	/**
	 * 设置需分组的原始数据集
	 * 
	 * @param dataSet
	 */

	public void setDataSet(ArrayList dataSet) {
		this.dataSet = dataSet;
	}

	/**
	 * 获取结果分组
	 * 
	 * @return 结果集
	 */

	public ArrayList> getCluster() {
		return cluster;
	}

	/**
	 * 构造函数,传入需要分成的簇数量
	 * 
	 * @param k
	 *            簇数量,若k<=0时,设置为1,若k大于数据源的长度时,置为数据源的长度
	 */
	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]);
		}
	}

	/**
	 * 初始化中心数据链表,分成多少簇就有多少个中心点
	 * 
	 * @return 中心点集
	 */
	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


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

5、测试

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


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

你可能感兴趣的:(algorithm,java)