`

k-means

阅读更多
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聚类算法

    Java实现的k-means聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...

    k-means算法课件ppt

    k-means算法是一种广泛应用的无监督学习方法,主要用于数据聚类。它的主要目标是将数据集分割成k个不同的簇,使得每个数据点都尽可能接近其所在簇的中心,而不同簇之间的数据点尽可能远离。在讲解k-means算法时,...

    K均值聚类即K-Means算法详解PPT

    K均值聚类,也称为K-Means算法,是一种在数据挖掘和机器学习领域中应用广泛的无监督学习方法。通过聚类算法,我们可以将数据点分组成具有相似特性的簇,以揭示数据内在的结构和模式。K-Means因其简单高效而被广泛...

    k-means.zip_k-means++ matlab_kmeans聚类matlab_kmeans聚类函数_matlab k-

    k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据点分配到最近的聚类中心来组织数据,这些聚类中心是预先定义的“k”个点。在MATLAB中,实现k-means算法非常便捷,因为MATLAB...

    k-means_kmeans案例_k-means聚类算法_k-means实战_K._

    k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据点分配到最近的聚类中心来实现自动分组,从而揭示数据的内在结构。以下是对k-means算法及其在实战中应用的详细说明。 **一、...

    ISODATA及K-means聚类算法

    ISODATA(Iterative Self-Organizing Data Analysis Technique)与K-means是两种常见的无监督机器学习算法,常用于数据的聚类分析。这两种方法在处理大数据集时,能够自动发现数据中的内在结构和模式,将相似的数据...

    k-means.zip_assignment_k-means_machine learning ex7

    《K-means聚类算法详解——基于Coursera机器学习课程Ex7》 在机器学习领域,K-means算法是一种广泛应用的无监督学习方法,它主要用于数据的聚类分析。K-means算法的核心思想是通过迭代寻找数据的最佳分组,使得同一...

    K-Means-improvement_k-means_K均值_K._

    K均值(K-Means)算法是一种广泛应用的无监督学习方法,主要用于数据聚类。在数据挖掘和机器学习领域,K-Means因其简单、高效的特点而备受青睐。其核心思想是通过迭代将数据点分配到最近的聚类中心,从而形成K个簇。...

    DP-means k - means聚类算法的比较

    在给定的项目"Python-DP-Means-Clustering-master"中,很可能包含了这两个算法的代码实现,包括数据预处理、模型训练和结果评估等部分。 为了比较这两种算法,我们可以考虑以下几个方面: 1. **性能**:比较两者的...

    k-means聚类 动画演示

    k-means聚类是一种广泛应用的数据挖掘技术,主要目的是将数据集划分为K个互不重叠的类别,每个类别内部的数据点尽可能相似,而类别之间的差异性则尽可能大。这个过程是通过迭代来实现的,直到满足某种停止条件,如...

    K-means.rar_K._k-means聚类算法

    K-means算法是一种广泛应用的无监督机器学习方法,主要用于数据的聚类分析。它通过将数据集中的样本点分配到预先设定的K个类别中,使得每个类别的内部数据相似度最大,而不同类别间的差异性最大。在这个“K-means....

    基于K-means聚类算法的图像分割(MATLAB实现).rar_ASV聚类_K-Means图像分割_k means_rest

    《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...

    k-means算法实例

    **K-means算法详解** K-means是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。它通过迭代过程将数据点分配到预定义数量(K)的类别中,目标是使得同一类别内的数据点相互接近,不同类别之间的数据点尽...

    模式识别 K-Means算法 实现模式分类

    K-Means算法是机器学习领域中一种广泛应用的无监督聚类方法,它主要用于将数据集中的样本点划分到不同的类别或簇中。在模式识别中,K-Means算法常用于对未知分类的数据进行自动分组,以便于后续分析和理解。Matlab...

    ( 2007_k-means++, the advantages of careful seeding

    k-means算法是一种广泛使用的聚类技术,目的在于最小化同一聚类中点之间的平均平方距离。尽管k-means算法在理论上没有准确性保证,但其简单性和快速性在实践中极具吸引力。论文《k-means++: The Advantages of ...

    k-means_K-Means算法实现_K._聚类可视化_数据可视化、_

    K-Means算法是机器学习领域中广泛应用的一种无监督学习方法,主要用于数据的聚类分析。这个算法的主要目标是将数据集分割成K个不同的类别(或簇),使得每个簇内的数据点彼此相似,而不同簇之间的数据点差异较大。...

    关于K-means算法在航空公司客户价值分析

    K-means算法是一种广泛应用的无监督机器学习方法,主要用于数据聚类。在航空公司的客户价值分析中,K-means可以帮助企业识别不同的客户群体,以便更好地理解客户需求,优化服务,提高客户满意度,甚至实现精准营销。...

    Matlab 基于K-means实现数据聚类分析含Matlab源码.zip

    本资源"Matlab 基于K-means实现数据聚类分析含Matlab源码.zip"提供了一种使用Matlab进行K-means聚类的方法,包含完整的源代码,便于学习和应用。 Matlab是一款强大的数学计算软件,特别适合处理和分析各种类型的...

Global site tag (gtag.js) - Google Analytics