`
grunt1223
  • 浏览: 423249 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Standard Kmean Cluster的实现[Java]

阅读更多
Kmean Cluster是一种机器学习中常用的无监督分析方法,例如,在最近的项目中,要从数以百万、千万计的高维图像特征中提取具有代表性的视觉词,就用到了此类技术。

Kmean并不是一种高效的算法,理论可以证明,在欧几里得空间中的Kmean问题是NP-Hard(即使聚类数仅为2)。假设单个向量维度为d,向量数为n,目标聚类数为k,则算法的时间复杂度=n^(dk+1)*logn。

kmean的示意图如下:



一些启发式的算法对Standard Kmean的效率进行了优化,常见的包括:
  • 基于最大期望的算法(EM algorithm):采用概率的方式将输入向量分配到各个聚类当中(而非Standard Kmean中的绝对分配),并且采用高斯分布代替Standard Kmean中的算术平均值计算聚类中心。
  • Kmean++:通过选取初始聚类集合来达到更好的效果
  • filtering algorithm:通过使用kd树来加速Kmean效率
  • 其它优化算法:诸如coresets、triangle inequ以及Escape local optima等算法

尽管如此,经典的Standard Kmean仍然是使用频率较高的聚类算法,在数据量不大或者demo阶段被广为使用,下面给出java实现的代码:

public Cluster[] cluster(final List<Clusterable> values, int numClusters) {
    Cluster[] clusters = calculateInitialClusters(values, numClusters);
    
    boolean recalculateClusters = true;

    int numIterations = 0;
    while (recalculateClusters) {
        // add all items to nearest cluster
	clusters = assignClusters(clusters, values);

	// see if the cluster distance hasn't moved
	recalculateClusters = mChecker.recalculateClusters(clusters);

	// if it needs to be run again, set up new clusters on the updated
	// centers
	if (recalculateClusters) {
	    if (numIterations > mMaxReclustering) {
	        recalculateClusters = false;
	    }

	    clusters = getNewClusters(clusters);

	    numIterations++;
        }
    }

    return clusters;
}


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



public class KMeansClusterer extends AbstractKClusterer {
	public KMeansClusterer() {
		super();
	}
	
	protected Cluster[] assignClusters(Cluster[] clusters,final List<Clusterable> values){
		assignClustersByDistance(clusters, values);
		return clusters;
	}
	
	protected void assignClustersByDistance(Cluster[] clusters, List<Clusterable> values){
		for ( int j = 0; j < values.size(); j++ ){
			Clusterable val = values.get(j);
			Cluster nearestCluster = null;
			double minDistance = Float.MAX_VALUE;
			for ( int i = 0; i < clusters.length; i++ ){
				Cluster cluster =  clusters[i];
				double distance = ClusterUtils.getEuclideanDistance(val,cluster);
				//System.out.println("cluster " + i + ", point " + j + ",distance: " + distance);
				if ( distance < minDistance ){
					nearestCluster = cluster;
					minDistance = distance;
				}
			}
			nearestCluster.addItem(val);
		}
	}
	
	protected Cluster[] getNewClusters(Cluster[] clusters){
		for ( int i = 0; i < clusters.length; i++ ){
			if ( clusters[i].getItems().size() > 0 )
				clusters[i] = new Cluster(clusters[i].getClusterMean(),i);
		}
		return clusters;
	}
	
	public static void main(String args[]){
		Random random = new Random(System.currentTimeMillis());
		int numPoints = 50;
		List<Clusterable> points = new ArrayList<Clusterable>(numPoints);
		for ( int i = 0; i < numPoints; i++ ){
			int x = random.nextInt(1000) - 500;
			int y = random.nextInt(1000) - 500;
			points.add(new Point((float)x,(float)y));
		}
		KClusterer clusterer = new KMeansClusterer();
		Cluster[] clusters = clusterer.cluster(points,10);
		for ( Cluster c : clusters ){
			System.out.println(c.getItems().size());
		}
	}
	
	public static boolean hasBadValue(double[] values){
		for ( double value : values ){
			if ( !(value < 1 && value > -1) ){
				System.out.println(value + " is 'bad'");
				return true;
			}
		}
		return false;
	}
}


Standard Kmean在大数据量时其表现往往不尽如人意,后续我会附上kd random forest的优化算法
  • 大小: 46.6 KB
7
6
分享到:
评论
2 楼 qiangailei 2011-03-03  
1 楼 kimmking 2011-02-18  
ANN--

相关推荐

    基于Kmean聚类实现乳腺肿瘤分割附matlab代码.zip

    【基于Kmean聚类实现乳腺肿瘤分割附matlab代码】是一个针对医学图像处理领域的实践项目,主要使用MATLAB 2019a环境进行开发。K-means聚类是一种无监督学习方法,常用于数据分类和图像分割。在这个项目中,它被用来...

    基于kmean聚类实现用户分层RFM模型.rar

    model = KMeans(algorithm='lloyd', n_clusters=8, init = 'k-means++', n_init=10, max_iter=17, random_state=2022, verbose=False ) model.fit(train) # 可视化聚类结果————对输入数据标准化处理,...

    java kmeans聚合算法

    在本例中,描述提到了从Pascal语言转换到Java实现,这意味着我们将讨论如何在Java环境下构建KMeans算法来处理坐标数据,如找出一千个坐标的重心点。 KMeans算法的基本步骤如下: 1. **初始化**:选择K个初始质心...

    label,KMean算法

    在OpenCV中,`kmeans()`函数提供了一个实现KMean算法的接口,可以方便地用于数据聚类。 KMean算法的基本步骤如下: 1. **初始化**:选择K个初始聚类中心,通常随机选取数据集中的一部分点作为中心。 2. **分配**:...

    基于Kmean实现图像压缩附matlab代码.zip

    本教程将深入探讨如何利用MATLAB来实现基于K-means的图像压缩。 一、K-means算法原理 K-means算法是通过迭代过程将数据点分配到预先设定的K个聚类中心中,目标是最小化各个点到其所属聚类中心的距离平方和。在图像...

    knn/kmean的python实现及可视化

    knn/kmean的python实现及可视化

    python kmean 聚类简单算法,直接可以运行

    python简单实现kmean聚类算法

    【图像分割】基于Kmean聚类实现乳腺肿瘤分割附matlab代码.zip

    1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 ...

    Kmean图像聚类算法

    Kmean matlab 中心聚类 基于lab图像空间

    Matlab Kmean聚类算法

    在Matlab中,Kmean算法的实现非常方便,内置的`kmeans`函数即可完成这项工作。 **1. Kmeans算法原理** Kmean算法的基本思想是:假设我们有K个初始的聚类中心,数据集中的每个点会根据与这K个中心的距离被分配到...

    Kmean.rar_kmean_kmean 二维_matlab 随机点_matlab随机点_二维 高斯分布

    在提供的压缩包中,包含了几个关键的MATLAB脚本文件,它们可能是Kmean算法的实现和相关辅助函数: 1. `kmfunc1.m` 和 `kmfunc2.m`:这两个文件很可能是Kmean算法的核心实现。在MATLAB中,Kmean算法通常包含初始化...

    vc6.0实现kmean

    在本文中,我们将深入探讨如何使用Visual C++ 6.0(简称VC6.0)实现数据挖掘领域中经典的K-Means聚类算法。K-Means是一种无监督学习方法,常用于对数据集进行分组,使得同一组内的数据点相互之间的距离最小,而不同...

    kmean.zip_K._Kmean分类_kmean_matlab kmean 分类_状态分类

    在本案例中,我们看到的"K._Kmean分类_kmean_matlab kmean 分类_状态分类"是一个关于使用Matlab实现k均值算法进行状态分类的项目。这个项目包含了一个名为"kmean.m"的Matlab源代码文件,很可能是实现k均值算法的函数...

    kmean聚类(实现)和层次聚类.zip

    《kmean聚类与层次聚类的实现及应用探索》 在数据挖掘和机器学习领域,聚类是一种无监督学习方法,主要用于发现数据中的结构和模式,而无需预先指定类别。本篇将深入探讨两种常见的聚类算法:K-means聚类和层次聚类...

    kmean图像分割

    基于kmean算法的用于RGB图像分割的matlab代码,用来遥感,街景,物体分类识别,按分类事物规定初始中心值,自定义分类数和分类色彩。

    kmean图像分割方法

    K均值算法可以对这些像素点进行聚类,形成不同的颜色或亮度区域,从而实现图像分割。 1. **色彩聚类**:在彩色图像中,K均值可以根据像素的RGB值将图像划分为K个颜色区域,每个区域代表一种颜色模式。 2. **灰度...

    kmean聚类算法源代码

    下面将基于这些信息详细阐述K-Means算法的基本原理、实现步骤,并结合给出的Java代码片段进行分析。 ### K-Means聚类算法概述 K-Means是一种常用的无监督学习方法,用于数据挖掘和机器学习中的聚类任务。它的目标...

    Kmean 分類器

    在C#中实现Kmean算法,可以利用.NET框架提供的各种数据结构和算法库。C#的强类型系统和面向对象特性使得代码可读性和可维护性较高。以下是一些关键步骤的C#实现细节: - **数据预处理**:通常需要将输入数据归一化...

    Desktop_kmean_

    在描述“kmean算法实现数据分析”中,我们可以理解这个项目的核心是使用K-means算法来处理和理解数据。K-means的工作原理是首先随机选择初始的聚类中心,然后计算每个数据点与这些中心的距离,根据最短距离将数据点...

    Kmean 演示程序

    在这个KMean演示程序中,我们很可能会找到关于如何实现和应用KMeans算法的详细步骤。KMeans的目标是将数据集分成K个不同的簇,使得每个簇内的数据点彼此相似,而不同簇之间的数据点差异较大。这里,"K"是预先设定的...

Global site tag (gtag.js) - Google Analytics