- 浏览: 543363 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
K-MEANS 算法
输入聚类个数 k ,以及包含 n 个数据对象的数据库,输出满足方差最小标准的 k 个聚类。
k-means 算法接受输入量 k ;然后将 n 个数据对象划分为 k 个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个 “ 中心对象 ” (引力中心)来进行计算的。
k-means 算法的工作过程说明如下:首先从 n 个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数 。 k 个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
处理流程
( 1 ) 从 n 个数据对象任意选择 k 个对象作为初始聚类中心;
( 2 ) 循环( 3 )到( 4 )直到每个聚类不再发生变化为止 ;
( 3 ) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;
( 4 ) 重新计算每个(有变化)聚类的均值(中心对象)
计算复杂度:
O(nkt), 其中 t 是迭代次数。
下面是程序代码:
效果是分成了1,2,3,5,6,7,9,10,11 和 100,150,200 和 1000三组,和感觉上的聚类一样:)
public class BasicKMeans { public static void main(String[] args) { double [] p={1,2,3,5,6,7,9,10,11,100,150,200,1000}; int k=3; double [][] g; g=cluster (p,k); for ( int i=0;i<g. length ;i++){ for ( int j=0;j<g[i]. length ;j++){ System. out .print(g[i][j]+ "\t" ); } System. out .println(); } } /** * 聚类函数 * @param p 数据对象 * @param k 聚类数目 * @return */ public static double [][] cluster( double [] p, int k){ double [] c= new double [k]; // 旧的聚类中心 double [] nc= new double [k]; // 新的聚类中心 double [][] g; // 结果 /* * 1. 初始化聚类中心(经典方式是随机选取 k 个,本例中取前 k 个) */ for ( int i=0;i<k;i++){ c[i]=p[i]; } /* * 2. 循环聚类,更新聚类中心直到不变为止 */ while ( true ){ /* * 2.1 根据数组中每个元素分配给当前聚类中心 */ g=group (p,c); /* * 2.2 计算分配后的聚类中心 */ for ( int i=0;i<g. length ;i++){ nc[i]=center (g[i]); } /* * 2.3 更新聚类中心 */ if (!equal (nc,c)){ c=nc; nc= new double [k]; } else { break ; } } //while(true) return g; } /** * 根据聚类中心 c 将数组 p 中元素分配到不同类别 !!! * @param p 待分配的数组 * @param c 聚类中心数组 * @return */ private static double [][] group( double [] p, double [] c) { int [] gi= new int [p. length ]; // 记录每个元素被归到哪一类 /* * 考察每个元素 pi 同每个聚类中心 cj 的距离, * 距离最小就将 pi 归为 j 类 */ for ( int i=0;i<p. length ;i++){ double [] d= new double [c. length ]; for ( int j=0;j<c. length ;j++){ d[j]=distance (p[i],c[j]); } int minDistOffset=min (d); gi[i]=minDistOffset; } double [][] g= new double [c. length ][]; // 存放分组结果 /* * 根据上面找到的结果,设置好返回值 */ for ( int i=0;i<c. length ;i++){ int s=0; // 某类的大小 for ( int j=0;j<gi. length ;j++){ if (gi[j]==i) s++; } g[i]= new double [s]; s=0; for ( int j=0;j<gi. length ;j++){ if (gi[j]==i){ g[i][s]=p[j]; s++; } } } return g; } /** * 重新计算一个类的中心(简单的以为聚类返回其算术平均值) * @param gi * @return */ private static double center( double [] gi) { return sum (gi)/gi. length ; } /** * 返回两点的一维欧氏距离 */ private static double distance( double x, double y){ return Math.abs (x-y); } /** * 返回数组和 */ private static double sum( double [] arr) { double sum=0.0; for ( int i=0;i<arr. length ;i++){ sum+=arr[i]; } return sum; } /** * 返回数组(第一个)最小元素下标 */ private static int min( double [] arr){ int min=0; double minEle=arr[0]; for ( int i=1;i<arr. length ;i++){ if (arr[i]<minEle){ min=i; minEle=arr[i]; } } return min; } /** * 判断两个数组是否相同 */ private static boolean equal( double [] a, double [] b){ if (a. length !=b. length ){ return false ; } else { for ( int i=0;i<a. length ;i++){ if (a[i]!=b[i]) return false ; } } return true ; } }
- BasicKMeans.rar (1.3 KB)
- 下载次数: 6
发表评论
-
快排备忘
2013-10-26 11:27 582http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 4026页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 725本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2251本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 2001k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1054一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 1007要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 758引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1232引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1931待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 922参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 971这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7217二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1079这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1578一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1538一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
大整数运算(部分转载)
2012-04-12 21:36 1203待补充:“浮点数高精度运算” 参见这里==> ... -
单向链表相关
2012-04-10 16:42 994单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1683前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(二)——双向BFS
2012-03-24 17:18 3035参考这篇文章,以下前 ...
相关推荐
Java实现的k-means聚类算法详解 k-means聚类算法是一种常用的无监督学习算法,用于对数据进行聚类分析。该算法的主要思想是将相似的数据点聚类到一起,形成不同的簇。Java语言是实现k-means聚类算法的不二之选。 ...
基于K-means聚类算法的图像分割 算法的基本原理: 基于K-means聚类算法的图像分割以图像中的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。 算法步骤: ①随机选取...
《基于K-means聚类算法的图像分割在MATLAB中的实现》 图像分割是计算机视觉领域中的基础任务,它旨在将图像划分为多个区域或对象,每个区域具有相似的特征。K-means聚类算法是一种广泛应用的数据分析方法,它通过...
基于 K-means 聚类算法的图像区域分割,首先从数据样本种选取K个点作为初始聚类中心,其次计算各个样本到聚类的距离,把样本归到离它最近的那个聚类中心所在的累,计算新形成的每个聚类的数据对象的平均值来得到新的...
k-means聚类算法是其中最简单且广泛使用的算法之一,尤其适用于处理大规模数据集。本篇文章将深入探讨如何在Matlab环境下实现k-means算法对三维数据进行分类,并结合提供的源代码进行解析。 首先,k-means算法的...
标题“基于 K-means 聚类算法的图像区域分割”揭示了这是一个关于利用K-means算法处理图像处理问题的项目。K-means聚类是一种常见的无监督学习方法,用于将数据集划分为K个互不重叠的类别,每个类别由其内部数据点的...
K-means聚类算法是一种广泛应用的无监督学习方法,主要用于数据的分组或分类,尤其在数据挖掘和机器学习领域。它的目标是将数据集划分为k个互不重叠的簇,使得同一簇内的数据点间的相似度尽可能高,而不同簇之间的...
基于k-means聚类算法的研究涉及了数据挖掘领域中的关键算法,该研究由黄韬、刘胜辉、谭艳娜三位研究人员共同完成,其研究机构分别为哈尔滨理工大学计算机科学与技术学院、软件学院和哈尔滨工程大学计算机科学与技术...
K-MEANS聚类算法的实现 K-MEANS聚类算法是一种常用的无监督机器学习算法,主要用于对数据进行聚类分析。该算法的主要思想是将相似的数据对象划分到同一个簇中,使得簇内的数据对象尽量相似,而簇间的数据对象尽量...
《K-means聚类算法在计算机视觉中的应用与MATLAB实现》 K-means聚类算法,作为一种简单而有效的无监督机器学习方法,被广泛应用于数据挖掘和图像处理领域,尤其是在计算机视觉中,它能够对图像进行自动分类,识别...
分布式K-means聚类算法是大数据分析中处理大规模数据集的一个重要工具。随着数据量的日益增长,传统的集中式K-means算法在面对海量数据时,由于计算资源和内存限制,常常效率低下,甚至无法有效执行。为了解决这一...
K-Means聚类算法是一种在数据挖掘和机器学习领域广泛应用的无监督学习算法,其核心思想是根据数据对象之间的相似度将它们划分为若干个簇。K-Means算法的主要优点是原理简单、效果显著、实现方便,使得它成为许多应用...
K-Means聚类算法是一种广泛应用的无监督学习方法,主要用于数据的分组或分类。在C#中实现K-Means,可以帮助开发者在各种数据分析和机器学习项目中进行数据处理。以下是关于K-Means聚类算法及其C#实现的关键知识点: ...
根据提供的文件信息,本文主要讨论了在数据挖掘领域中,尤其是在高维混合属性数据挖掘中运用K-Means聚类算法的方法。该方法旨在通过提高聚类分析的质量,来增强对高维数据的挖掘效果。以下是对该文档中提到的知识点...
在本实验中,我们将深入探讨如何使用Python编程语言和K-Means聚类算法来对MNIST数据集中的手写数字图像进行分类。MNIST数据集是机器学习领域的一个经典基准,它包含了大量的0到9的手写数字图像,用于训练和测试图像...
为了解决这一问题,本文提出了利用K-means聚类算法对住院费用数据进行挖掘的方法。本文的研究与开发涵盖了数据预处理、数据分析等多个方面,详细介绍了使用该算法的流程和实际应用。 首先,文章提出了K-means聚类...
K-Means聚类算法是数据分析中常用的一种无监督学习算法,该算法通过迭代的方式将数据划分为K个聚类,并确保同一个聚类内的数据点相似度较高,不同聚类之间的数据点相似度较低。在审计疑点发现中,K-Means算法可以...