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
分享到:
相关推荐
【基于Kmean聚类实现乳腺肿瘤分割附matlab代码】是一个针对医学图像处理领域的实践项目,主要使用MATLAB 2019a环境进行开发。K-means聚类是一种无监督学习方法,常用于数据分类和图像分割。在这个项目中,它被用来...
model = KMeans(algorithm='lloyd', n_clusters=8, init = 'k-means++', n_init=10, max_iter=17, random_state=2022, verbose=False ) model.fit(train) # 可视化聚类结果————对输入数据标准化处理,...
在本例中,描述提到了从Pascal语言转换到Java实现,这意味着我们将讨论如何在Java环境下构建KMeans算法来处理坐标数据,如找出一千个坐标的重心点。 KMeans算法的基本步骤如下: 1. **初始化**:选择K个初始质心...
在OpenCV中,`kmeans()`函数提供了一个实现KMean算法的接口,可以方便地用于数据聚类。 KMean算法的基本步骤如下: 1. **初始化**:选择K个初始聚类中心,通常随机选取数据集中的一部分点作为中心。 2. **分配**:...
本教程将深入探讨如何利用MATLAB来实现基于K-means的图像压缩。 一、K-means算法原理 K-means算法是通过迭代过程将数据点分配到预先设定的K个聚类中心中,目标是最小化各个点到其所属聚类中心的距离平方和。在图像...
knn/kmean的python实现及可视化
python简单实现kmean聚类算法
1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 ...
Kmean matlab 中心聚类 基于lab图像空间
在Matlab中,Kmean算法的实现非常方便,内置的`kmeans`函数即可完成这项工作。 **1. Kmeans算法原理** Kmean算法的基本思想是:假设我们有K个初始的聚类中心,数据集中的每个点会根据与这K个中心的距离被分配到...
在提供的压缩包中,包含了几个关键的MATLAB脚本文件,它们可能是Kmean算法的实现和相关辅助函数: 1. `kmfunc1.m` 和 `kmfunc2.m`:这两个文件很可能是Kmean算法的核心实现。在MATLAB中,Kmean算法通常包含初始化...
在本文中,我们将深入探讨如何使用Visual C++ 6.0(简称VC6.0)实现数据挖掘领域中经典的K-Means聚类算法。K-Means是一种无监督学习方法,常用于对数据集进行分组,使得同一组内的数据点相互之间的距离最小,而不同...
在本案例中,我们看到的"K._Kmean分类_kmean_matlab kmean 分类_状态分类"是一个关于使用Matlab实现k均值算法进行状态分类的项目。这个项目包含了一个名为"kmean.m"的Matlab源代码文件,很可能是实现k均值算法的函数...
《kmean聚类与层次聚类的实现及应用探索》 在数据挖掘和机器学习领域,聚类是一种无监督学习方法,主要用于发现数据中的结构和模式,而无需预先指定类别。本篇将深入探讨两种常见的聚类算法:K-means聚类和层次聚类...
基于kmean算法的用于RGB图像分割的matlab代码,用来遥感,街景,物体分类识别,按分类事物规定初始中心值,自定义分类数和分类色彩。
K均值算法可以对这些像素点进行聚类,形成不同的颜色或亮度区域,从而实现图像分割。 1. **色彩聚类**:在彩色图像中,K均值可以根据像素的RGB值将图像划分为K个颜色区域,每个区域代表一种颜色模式。 2. **灰度...
下面将基于这些信息详细阐述K-Means算法的基本原理、实现步骤,并结合给出的Java代码片段进行分析。 ### K-Means聚类算法概述 K-Means是一种常用的无监督学习方法,用于数据挖掘和机器学习中的聚类任务。它的目标...
在C#中实现Kmean算法,可以利用.NET框架提供的各种数据结构和算法库。C#的强类型系统和面向对象特性使得代码可读性和可维护性较高。以下是一些关键步骤的C#实现细节: - **数据预处理**:通常需要将输入数据归一化...
在描述“kmean算法实现数据分析”中,我们可以理解这个项目的核心是使用K-means算法来处理和理解数据。K-means的工作原理是首先随机选择初始的聚类中心,然后计算每个数据点与这些中心的距离,根据最短距离将数据点...
在这个KMean演示程序中,我们很可能会找到关于如何实现和应用KMeans算法的详细步骤。KMeans的目标是将数据集分成K个不同的簇,使得每个簇内的数据点彼此相似,而不同簇之间的数据点差异较大。这里,"K"是预先设定的...