K-means聚类的java实现
今天把自己写的一个机器学习算法库中的K-means算法整理了一下,因为这个算法较其他的相比相对独立,可以单独贴出来,不会引用太多的其他类(不过还是有点引用,不过引用些简单的功能,看类名就知道什么意思了)。
基本功能和规则为:
1.当然是进行k-means算法,对数据集(这里使用二维数组来表示数据集,行数为数据总数,列数为数据维度)进行N维聚类
2.可以指定收敛的阀值(convergenceDis默认为0.0001)
3.为避免局部最小,可以指定重复运行次数,通过设定replicates的数值来指定,默认为0,即只重复一次聚类过程
4.测试数据格式为每一行代表一个输入,用空格分隔输入的各个维度,为了计算结果不出太大意外,建议对原始数据进行归一化
首先上骨架代码:
View Code
Matrix
package org.tadoo.ml;
import java.io.PrintStream;
import org.tadoo.ml.exception.MatrixComputeException;
/**
* 矩阵结构
*
* <p>time:2011-3-23</p>
* @author T. QIN
*/
public class Matrix
{
private int rowNum;
private int colNum;
private double value[][];
/**
* 构造器方法
*
* @param rows 行数
* @param cols 列数
* @see:
* @author: T. QIN
*/
public Matrix(int rows, int cols)
{
this.rowNum = rows;
this.colNum = cols;
this.value = new double[rows][cols];
}
/**
* 构造器方法
*
* @param rows 行数
* @param cols 列数
* @param isInitialMemory 是否初始化权值矩阵
* @see:
* @author: T. QIN
*/
public Matrix(int rows, int cols, boolean isInitialMemory)
{
this.rowNum = rows;
this.colNum = cols;
if (isInitialMemory)
{
this.value = new double[rows][cols];
}
}
/**
* 替换矩阵值
*
* @param v
* @throws MatrixComputeException
* @see:
*/
public void changeWholeValue(double v[][]) throws MatrixComputeException
{
if (v.length != this.rowNum && v[0].length != this.colNum)
{
throw new MatrixComputeException("矩阵大小不拟合");
}
this.value = v;
}
public void print(PrintStream ps)
{
if (ps == null)
{
ps = System.out;
}
for (int i = 0; i < rowNum; i++)
{
for (int j = 0; j < colNum; j++)
{
ps.print(value[i][j] + "\t");
}
ps.println();
}
}
/**
* overwrite
*
* @return
* @see:
*/
public String toString()
{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < rowNum; i++)
{
for (int j = 0; j < colNum; j++)
{
sb.append(value[i][j] + "\t");
}
sb.append("\n");
}
return sb.toString();
}
/**
* rowNum的 get() 方法
* @return int rowNum.
*/
public int getRowNum()
{
return rowNum;
}
/**
* rowNum的 set() 方法
* @param rowNum The rowNum to set.
*/
public void setRowNum(int rowNum)
{
this.rowNum = rowNum;
}
/**
* colNum的 get() 方法
* @return int colNum.
*/
public int getColNum()
{
return colNum;
}
/**
* colNum的 set() 方法
* @param colNum The colNum to set.
*/
public void setColNum(int colNum)
{
this.colNum = colNum;
}
/**
* value的 get() 方法
* @return double[][] value.
*/
public double[][] getValue()
{
return value;
}
/**
* value的 set() 方法
* @param value The value to set.
*/
public void setValue(double[][] value)
{
this.value = value;
}
}
复制代码
MatrixComputeException
按 Ctrl+C 复制代码
DataUtil
按 Ctrl+C 复制代码
然后是测试:
View Code
package org.tadoo.ml.test;
import junit.framework.TestCase;
import org.tadoo.ml.Matrix;
import org.tadoo.ml.cluster.kmeans.KmeansCluster;
import org.tadoo.ml.util.DataUtil;
import org.tadoo.ml.util.Utils;
/**
* 测试K-means聚类器
*
* <p>time:2011-6-2</p>
* @author T. QIN
*/
public class TestKmeansCluster extends TestCase
{
Matrix dataSet = null;
double[][] ds = null;
protected void setUp()
{
dataSet = Utils.uniformFileInputIntoFeatures("D:\\test.s.txt");
ds = DataUtil.load("D:\\data1.txt");
}
/**
* 测试用K-means选取中心节点
*
* @see:
*/
public void testKmeansCenters()
{
KmeansCluster kmc = new KmeansCluster(dataSet.getValue(), 2);
kmc.train();
System.out.println(kmc.getTotalSumOfdistances());
System.out.println(kmc.getIter());
double[][] centers = kmc.getCenters();
for (int i = 0; i < centers.length; i++)
{
for (int j = 0; j < centers[i].length; j++)
{
System.out.print(centers[i][j] + "\t");
}
System.out.println();
}
}
public void testKmeansReplicate(){
KmeansCluster kmc = new KmeansCluster(dataSet.getValue(), 11);
kmc.setReplicates(12);
kmc.train();
KmeansCluster.KMCResult[] kmcr = kmc.getKmcresults();
for (int i = 0; i < kmcr.length; i++)
{
System.out.println("iters:"+kmcr[i].iters+"\tSum:"+kmcr[i].sum);
}
}
}
http://www.cnblogs.com/tadoo/archive/2011/06/02/2068591.html
因为是初学者,写的很冗长,不过多少能算出结果来了。
分享到:
相关推荐
Java实现的k-means聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...
k-means算法是一种广泛应用的无监督学习方法,主要用于数据聚类。它的主要目标是将数据集分割成k个不同的簇,使得每个数据点都尽可能接近其所在簇的中心,而不同簇之间的数据点尽可能远离。在讲解k-means算法时,...
K均值聚类,也称为K-Means算法,是一种在数据挖掘和机器学习领域中应用广泛的无监督学习方法。通过聚类算法,我们可以将数据点分组成具有相似特性的簇,以揭示数据内在的结构和模式。K-Means因其简单高效而被广泛...
k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据点分配到最近的聚类中心来组织数据,这些聚类中心是预先定义的“k”个点。在MATLAB中,实现k-means算法非常便捷,因为MATLAB...
k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据点分配到最近的聚类中心来实现自动分组,从而揭示数据的内在结构。以下是对k-means算法及其在实战中应用的详细说明。 **一、...
ISODATA(Iterative Self-Organizing Data Analysis Technique)与K-means是两种常见的无监督机器学习算法,常用于数据的聚类分析。这两种方法在处理大数据集时,能够自动发现数据中的内在结构和模式,将相似的数据...
《K-means聚类算法详解——基于Coursera机器学习课程Ex7》 在机器学习领域,K-means算法是一种广泛应用的无监督学习方法,它主要用于数据的聚类分析。K-means算法的核心思想是通过迭代寻找数据的最佳分组,使得同一...
K均值(K-Means)算法是一种广泛应用的无监督学习方法,主要用于数据聚类。在数据挖掘和机器学习领域,K-Means因其简单、高效的特点而备受青睐。其核心思想是通过迭代将数据点分配到最近的聚类中心,从而形成K个簇。...
在给定的项目"Python-DP-Means-Clustering-master"中,很可能包含了这两个算法的代码实现,包括数据预处理、模型训练和结果评估等部分。 为了比较这两种算法,我们可以考虑以下几个方面: 1. **性能**:比较两者的...
k-means聚类是一种广泛应用的数据挖掘技术,主要目的是将数据集划分为K个互不重叠的类别,每个类别内部的数据点尽可能相似,而类别之间的差异性则尽可能大。这个过程是通过迭代来实现的,直到满足某种停止条件,如...
K-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据集中的样本点分配到预先设定的K个类别中,使得每个类别的内部数据相似度最大,而不同类别间的差异性最大。在这个“K-means....
《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...
**K-means算法详解** K-means是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。它通过迭代过程将数据点分配到预定义数量(K)的类别中,目标是使得同一类别内的数据点相互接近,不同类别之间的数据点尽...
K-Means算法是机器学习领域中一种广泛应用的无监督聚类方法,它主要用于将数据集中的样本点划分到不同的类别或簇中。在模式识别中,K-Means算法常用于对未知分类的数据进行自动分组,以便于后续分析和理解。Matlab...
k-means算法是一种广泛使用的聚类技术,目的在于最小化同一聚类中点之间的平均平方距离。尽管k-means算法在理论上没有准确性保证,但其简单性和快速性在实践中极具吸引力。论文《k-means++: The Advantages of ...
K-Means算法是机器学习领域中广泛应用的一种无监督学习方法,主要用于数据的聚类分析。这个算法的主要目标是将数据集分割成K个不同的类别(或簇),使得每个簇内的数据点彼此相似,而不同簇之间的数据点差异较大。...
K-means算法是一种广泛应用的无监督机器学习方法,主要用于数据聚类。在航空公司的客户价值分析中,K-means可以帮助企业识别不同的客户群体,以便更好地理解客户需求,优化服务,提高客户满意度,甚至实现精准营销。...
本资源"Matlab 基于K-means实现数据聚类分析含Matlab源码.zip"提供了一种使用Matlab进行K-means聚类的方法,包含完整的源代码,便于学习和应用。 Matlab是一款强大的数学计算软件,特别适合处理和分析各种类型的...