30(1).原型聚类---k-means
原型聚类prototype-based clustering假设聚类结构能通过一组原型刻画。
常见的原型聚类有:
- k均值算法k-means
- 学习向量量化算法Learning Vector Quantization:LVQ
- 高斯混合聚类Mixture-of-Gaussian
一、k-means算法
1.k-means
1.1 给定样本集$D=\{X_1,X_2,...,X_N \}$,假设一个划分为$C=\{C_1,C_2,...,C_K\}$,定义该划分的平方误差为:
$err=\sum_{k=1}^K \sum_{x=1,X_i \in C_k} ||X_i - u_k||_2^2$,其中$u_k = \frac{1}{|C_k|} \sum_{X_i \in C_k}X_i$是簇$C_k$的均值向量。
$err$刻画了簇类样本围绕簇均值向量的紧密程度,其值越小,则簇内样本相似度越高。
k-means算法的优化目标为:最小化$err$。即:$min_C \sum_{k=1}^K \sum_{X_i \in C_k} ||X_i - u_k||_2^2$
1.2 k-means的优化目标需要考察$D$的所有可能的划分,这是一个NP难的问题。实际上k-means采用贪心策略,通过迭代优化来近似分解。
- 首先假设一组均值向量。
- 然后根据假设的均值向量给出了$D$的一个划分。
- 再根据这个划分来计算真实的均值向量:
- 如果真实的均值向量等于假设的均值向量,则说明假设正确。根据假设均值向量给出的$D$的一个划分确实是原问题的解。
- 如果真实的均值向量不等于假设的均值向量,则可以将真实的均值向量作为新的假设均值向量,继续迭代求解。
1.3 给定一组假设的均值向量,如何计算出$D$的一个簇划分?
k-means算法的策略是:样本离哪个簇的均值向量最近,则该样本就划归到那个簇。
1.4 k-means算法:
输入:样本集$D=\{X_1,X_2,...,X_N \}$,聚类簇数$K$
输出:簇划分$C=\{C_1,C_2,...,C_K \}$
算法步骤:
- 从$D$中随机选择$K$个样本作为初始均值向量$\{u_1,u_2,...,u_K \}$
- 重复迭代直到算法收敛,迭代过程:
- 初始化阶段:取$C_k = \varnothing,k=1,2,...,K$
- 划分阶段:令$i=1,2,...,N$:
- 计算$X_i$的簇标记:$\lambda_{i}=\arg \min _{k}\left\|\overrightarrow{{x}}_{i}-\vec{\mu}_{k}\right\|_{2}, k \in\{1,2, \cdots, K\}$,即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇
- 然后将样本$X_i$划入相应的簇:$C_{\lambda_i}=C_{\lambda_i} \cup {X_i}$
- 重计算阶段:计算$\hat{\vec{\mu}}_{k}: \hat{\vec{\mu}}_{k}=\frac{1}{\left|{C}_{k}\right|} \sum_{\vec{x}_{i} \in \mathbb{C}_{k}} \overrightarrow{{x}}_{i}$
- 终止条件判断:
- 如果对所有的$k \in \{1,2,...,K\}$,都有$\hat{u_k}=u_k$,则算法收敛,终止迭代
- 否则重赋值$u_k=\hat{u_k}$
1.5 k-means优点:
- 计算复杂度低,为$O(NKq)$,其中$q$为迭代次数。通常$K$和$q$要远远小于$N$,此时复杂度相当于$O(N)$
- 思想简单,容易实现。
1.6 k-means缺点:
- 需要确定聚类的数量K
- 分类结构严重依赖于分类中心的初始化。通常进行多次k-means,然后选择最优的那次作为最终聚类结构。
- 结果不一定是全局最优的,只能保证局部最优。
- 对噪声敏感。因为簇的中心是取平均,因此聚类簇很远地方的噪音会导致簇的中心点偏移。
- 无法解决不规则形状的聚类。
- 无法处理离散特征,如:国籍、性别等。
1.7 k-means性质:
- k-means实际上假设数据是呈现球形分布,实际任务中很少有这种情况。与之相比,GMM使用更加一般的数据表示,即高斯分布。
- k-means假设各个簇的先验概率相同,但是各个簇的数据量可能不均匀。
- k-means使用欧式距离来衡量样本与各个簇的相似度。这种距离实际上假设数据的各个维度对于相似度的作用是相同的。
- k-means中,各个样本点只属于与其相似度最高的那个簇,这实际上是硬分簇。
- k-means算法的迭代过程实际上等价于EM算法。
2.k-means++
2.1 k-means++属于k-means的变种,它主要解决k-means严重依赖于分类中心初始化的问题。
2.2 k-means++选择初始均值向量时,尽量安排这些初始均值向量之间的距离尽可能的远。
2.3 k-means++算法:
输入:样本集$D=\{X_1,X_2,...,X_N\}$,聚类簇数$K$
输出:簇划分$C=\{C_1,C_2,...,C_K\}$
算法步骤:
- 从$D$中随机选择1个样本作为初始均值向量组$\{u_1\}$
- 迭代,直到初始均值向量组有$K$个向量。假设初始均值向量组为$\{u_1,...,u_m\}$。迭代过程如下:
- 对每个样本$X_i$,分别计算其距$u_1,...,u_m$的距离。这些距离的最小值记作$d_i=min_{u_j}||X_i-u_j||$
- 对样本$X_i$,其设置为初始均值向量的概率正比于$d_i$。即:离所有的初始均值向量越远,则越可能被选中为下一个初始均值向量。
- 以概率分布$P=\{d_1,d_2,...,d_N\}$(未归一化的)随机挑选一个样本作为下一个初始均值向量$u_{m+1}$
- 一旦挑选出初始均值向量组$\{u_1,...,u_K\}$,剩下的迭代步骤与k-means相同。
3.k-modes
3.1 k-modes属于k-means的变种,它主要解决k-means无法处理离散特征的问题。
3.2 k-modes与k-means有两个不同点(假设所有特征都是离散特征):
- 距离函数不同。在k-modes算法中,距离函数为:$distance(X_i,X_j)=\sum_{d=1}^n I(x_{i,d}=x_{j,d})$,其中$I(\cdot)$为示性函数。上式的意义为:样本之间的距离等于他们之间不同属性值的个数。
- 簇中心的更新规则不同。在k-modes算法中,簇中心每个属性的取值为:簇内该属性出现频率最大的那个值$\hat{\mu}_{k, d}=\arg \max _{v} \sum_{\vec{x}_{i} \in \mathbb{C}_{k}} I\left(x_{i, d}=v\right)$,其中$v$的取值空间为所有样本在第$d$个属性上的取值。
4.k-medoids
4.1 k-medoids属于k-means的变种,它主要解决k-means对噪声敏感的问题。
4.2 k-medoids算法:
输入:样本集$D=\{X_1,X_2,...,X_N\}$,聚类簇数$K$
输出:簇划分$C=\{C_1,C_2,...,C_K\}$
算法步骤:
- 从$D$中随机选择$K$个样本作为初始均值向量$\{u_1,u_2,...,u_K\}$
- 重复迭代直到算法收敛,迭代过程:
- 初始化阶段:取$C_k=\oslash,k=1,2,...,K$。遍历每个样本$X_i,i=1,2,...,N$,计算它的簇标记:$\lambda_i=arg min_k ||X_i-u_k||_2,k \in \{1,2,...,K\}$。即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇。然后将样本$X_i$划入相应的簇:$C_{\lambda_i}=C_{\lambda_i} \cup \{X_i\}$
- 重计算阶段:遍历每个簇$C_k,k=1,2,...,K$:
- 计算簇新$u_k$距离簇内其他点的距离$d_u^{(k)}=\sum_{X_j^{(k)} \in C_k} ||u_k - X_j^{(k)}||$
- 计算簇$C_k$内每个点$X_i^{(k)}$距离簇内其他点的距离$d_i^{(k)}=\sum_{X_j^{(k)}} ||X_i^{(k)} - X_j^{(k)}||$。如果$d_i^{(k)} < d_u^{(k)}$,则重新设置簇中心:$u_k=X_i^{(k)}$,$d_u^{(k)}=d_i^{(k)}$
- 终止条件判断:遍历一轮簇$C_1,...,C_K$之后,簇心保持不变
4.3 k-medoids 算法在计算新的簇心时,不再通过簇内样本的均值来实现,而是挑选簇内距离其它所有点都最近的样本来实现。这就减少了孤立噪声带来的影响。
4.4 k-medoids 算法复杂度较高,为$O(N^2)$ 。其中计算代价最高的是计算每个簇内每对样本之间的距离。 通常会在算法开始时计算一次,然后将结果缓存起来,以便后续重复使用。
5.mini-batch k-means
5.1 mini-batch k-means 属于 k-means 的变种,它主要用于减少k-means 的计算时间。
5.2 mini-batch k-means 算法每次训练时随机抽取小批量的数据,然后用这个小批量数据训练。这种做法减少了k-means 的收敛时间,其效果略差于标准算法。
5.3 mini-batch k-means算法:
输入:样本数$D=\{X_1,X_2,...,X_N\}$,聚类簇数$K$
输出:簇划分$C=\{C_1,C_2,...,C_K\}$
算法步骤:
- 从$D$中随机选择$K$个样本作为初始均值向量$\{u_1,u_2,...,u_K \}$
- 重复迭代直到算法收敛,迭代过程:
- 初始化阶段:取$C_k = \varnothing,k=1,2,...,K$
- 划分阶段:随机挑选一个Batch的样本集合$B=X_{b1},...,X_{b_M}$,其中,$M$为批大小
- 计算$X_i,i=b_1,...,b_M$的簇标记:$\lambda_{i}=\arg \min _{k}\left\|{x}_{i}-\vec{\mu}_{k}\right\|_{2}, k \in\{1,2, \cdots, K\}$,即:将$X_i$离哪个簇的均值向量最近,则该样本就标记为那个簇
- 然后将样本$X_i,i=b_1,...,b_M$划入相应的簇:$C_{\lambda_i}=C_{\lambda_i} \cup {X_i}$
- 重计算阶段:计算$\hat{\vec{\mu}}_{k}: \hat{\vec{\mu}}_{k}=\frac{1}{\left|{C}_{k}\right|} \sum_{\vec{x}_{i} \in \mathbb{C}_{k}} \overrightarrow{{x}}_{i}$
- 终止条件判断:
- 如果对所有的$k \in \{1,2,...,K\}$,都有$\hat{u_k}=u_k$,则算法收敛,终止迭代
- 否则重赋值$u_k=\hat{u_k}$
30(1).原型聚类---k-means的更多相关文章
- 30:最小的K个数
import java.util.ArrayList; import java.util.TreeSet; /** * 面试题30:最小的K个数 * 输入n个整数,找出其中最小的K个数.例如输入4,5 ...
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- 聚类-K均值
数据来源:http://archive.ics.uci.edu/ml/datasets/seeds 15.26 14.84 0.871 5.763 3.312 2.221 5.22 Kama 14.8 ...
- KMeans聚类 K值以及初始类簇中心点的选取 转
本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...
- 【机器学习笔记五】聚类 - k均值聚类
参考资料: [1]Spark Mlib 机器学习实践 [2]机器学习 [3]深入浅出K-means算法 http://www.csdn.net/article/2012-07-03/2807073- ...
- 聚类--K均值算法
import numpy as np from sklearn.datasets import load_iris iris = load_iris() x = iris.data[:,1] y = ...
- 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k): r ...
- 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
随机推荐
- C++使用libcurl做HttpClient 和 curl_easy_setopt
curl_easy_setopt 参数设置 https://curl.haxx.se/libcurl/c/curl_easy_setopt.html 使用libcurl做HttpClient #if ...
- 为什么HashMap的加载因子是0.75?
说在前面 在HashMap中,默认创建的数组长度是16,也就是哈希桶个数为16,当添加key-value的时候,会先计算出他们的哈希值(h = hash),然后用return h & (l ...
- 一元建站-基于函数计算 + wordpress 构建 serverless 网站
前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...
- WPF之图片处理系列
WPF 中的一些图片处理方法 一,视觉处理(控件展示) 1,显示图片 Image控件展示 Xaml代码: <Image source="/Resources/Images/1.png& ...
- django甜甜的弹窗
GitHub中甜甜的弹窗地址: https://github.com/lipis/bootstrap-sweetalert 直接简单粗暴选择右下角的download,下载到本地一份文件 小猿取经中的相 ...
- Educational Codeforces Round 78 (Rated for Div. 2)
A题 给出n对串,求s1,是否为s2一段连续子串的重排,串长度只有100,从第一个字符开始枚举,sort之后比较一遍就可以了: char s1[200],s2[200],s3[200]; int ma ...
- AOP框架Dora.Interception 3.0 [3]: 拦截器设计
对于所有的AOP框架来说,多个拦截器最终会应用到某个方法上.这些拦截器按照指定的顺序构成一个管道,管道的另一端就是针对目标方法的调用.从设计角度来将,拦截器和中间件本质是一样的,那么我们可以按照类似的 ...
- 重新精读《Java 编程思想》系列之类的访问权限
Java 中,我们用访问权限修饰词确定库中的哪些类对于使用者是可以使用的. 访问权限修饰词有 public,protected,private 和什么都不写. 那么对于类来说,我们只可以用 publi ...
- sudo 1.2.27 - Security Bypass
EXP: https://www.exploit-db.com/exploits/47502?utm_source=dlvr.it&utm_medium=twitter 漏洞复现: 具体配置参 ...
- zip,rar及linux下常用的压缩格式
日常操作中我们经常使用到文件压缩操作,其使用一些特定的算法来减小文件的大小,可以提高传输数据时的速率和减少数据在一些存储机制上占有的空间大小,实现空间利用最大化. 比如:如果你想通过邮箱发送一个文件夹 ...