K-Means ++ 算法

Kmeans算法的缺陷:

• 聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适
• Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。(可以使用Kmeans++算法来解决)

K-Means ++ 算法:

k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

1. 从输入的数据点集合中随机选择一个点作为第一个聚类中心
2. 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3. 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
4. 重复2和3直到k个聚类中心被选出来
5. 利用这k个初始的聚类中心来运行标准的k-means算法

从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

1. 先从我们的数据库随机挑个随机点当“种子点”
2. 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
3. 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
4. 重复2和3直到k个聚类中心被选出来
5. 利用这k个初始的聚类中心来运行标准的k-means算法

可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因比较简单,如下图所示: 

假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。

时间: 2024-09-12 12:20:56

K-Means ++ 算法的相关文章

K近邻算法-KNN

K近邻算法-KNN 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个

k均值算法c++语言实现代码_C 语言

复制代码 代码如下: //k-mean.h #ifndef KMEAN_HEAD #define KMEAN_HEAD  #include <vector> #include <map>  //空间点的定义 class Node {     public:        double pos_x;        double pos_y;        double pos_z;      Node()      {          pos_x = 0.0;          p

K近邻算法

什么是K近邻算法     何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻 居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙.     用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个

OpenCV手写数字字符识别(基于k近邻算法)

  摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部分子图像并进行大小的归一化处理,特征提取将图像转化为特征向量,分类识别采用k-近邻分类方法进行分类处理,最后根据分类结果完成识别工作. 程序采用Microsoft Visual Studio 2010与OpenCV2.4.4在Windows 7-64位旗舰版系统下开发完成.并在Windows xp-32位

python实现k均值算法示例(k均值聚类算法)_python

简单实现平面的点K均值分析,使用欧几里得距离,并用pylab展示. 复制代码 代码如下: import pylab as pl #calc Euclid squiredef calc_e_squire(a, b):    return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2 #init the 20 pointa = [2,4,3,6,7,8,2,3,5,6,12,10,15,16,11,10,19,17,16,13]b = [5,6,1,4,2,4,3,1,

《大数据架构和算法实现之路:电商系统的技术实战》——1.3 算法:朴素贝叶斯和K最近邻

1.3 算法:朴素贝叶斯和K最近邻 1.3.1 朴素贝叶斯 朴素贝叶斯(Naive Bayes)分类是一种实用性很高的分类方法,在理解它之前,我们先来复习一下贝叶斯理论.贝叶斯决策理论是主观贝叶斯派归纳理论的重要组成部分.贝叶斯决策就是在信息不完整的情况下,对部分未知的状态用主观概率进行估计,然后用贝叶斯公式对发生概率进行修正,最后再利用期望值和修正概率做出最优决策.其基本思想具体如下. 1)已知类条件概率密度参数表达式和先验概率. 2)利用贝叶斯公式转换成后验概率. 3)根据后验概率大小进行决

预测-kNN分类算法中k的取值如何确定?

问题描述 kNN分类算法中k的取值如何确定? kNN分类算法中k的取值如何确定,是一个一个试,直到试出预测准确率最高的么? 解决方案 第九章 KNN(K最近邻分类算法)

K-Means 数据聚集算法

K-Means是什么?引用一篇网友的文章: http://coolshell.cn/articles/7779.html PostgreSQL有一个k-means插件,可以用来实现kmean数据聚集统计,用在窗口函数中. 用法举例:     SELECT kmeans(ARRAY[x, y, z], 10) OVER (), * FROM samples;     SELECT kmeans(ARRAY[x, y], 2, ARRAY[0.5, 0.5, 1.0, 1.0]) OVER (),

k-means聚类算法介绍 k-means聚类算法怎么用

前提条件 特定领域的经验要求:无 专业经验要求:无行业经验 不需要机器学习的知识,但是读者应该熟悉基本的数据分析(如,描述性分析).为了实践该示例,读者也应该熟悉Python. K-means聚类简介 K-means聚类是一种无监督学习,用于有未标记的数据时(例如,数据没有定义类别或组).该算法的目标是在数据中找到分组,变量K代表分组的个数.该算法迭代地分配每个数据点到提供特征的K分组中的一个.数据点基于特征相似性聚集.K-means聚类算法的结果是: 1. K聚类的质心,它可以用来标记新数据

K-tree 0.4.1发布 聚类算法工具

K-tree是一种树状的聚类算法.它也被称为树结构矢量量化(TSVQ).对聚类分析的目标是在相似的组对象.每一个K-tree的对象代表一个维矢量空间.树中的所有矢量必须是相同的维数. K-tree提供了一个可伸缩的集群方法相结合的B+-tree和K - means的聚类算法.集群可以用来解决信号处理问题,采用机器学习,和其他环境.它最近也被用来解决在维基百科文档集群问题. K-tree 0.4.1该版本针对快速原型制造和研究领域发布了Python版本. 下载地址: http://nchc.dl.