关于K-means聚类算法,请回答以下问题:
1).写出将N个样本X=(x1, ... xN)聚类成k类的k_means聚类算法的优化目标;
2).描述K-means终止的常用条件;
3).以Kmeans算法为例,描述Expectation-Maximization(EM)算法的基本原理与步骤。
4).描述如何用mapreduce分布式实现K-means算法
1)目标函数:
2) 终止条件:
一般是目标函数达到最优或者达到最大的迭代次数即可终止
3)K-means的算法流程如下:
1)随机确定K个中心位置。
2)将各个数据项分配给最邻近的中心点。
3)分配完成后,聚类中心会移到该类所有节点的平均位置处。
4)重复2)和3)直至结果不再变化
EM算法流程如下:
第一步是期望(E)步,利用当前已知参数值来估计最优隐变量的值。
第二步是最大化(M)步,就是寻找能使E步期望似然最大化的参数。
然后,新的参数值重新被用于E步,直到收敛到局部最优解。
回头来看k-means,这里我们的已知变量就是各个类的中心点ci,而隐变量就是物体的标签类别Ci,这是我们不知道的。
一开始我们会根据随机确定的中心点位置(已知变量)来确定他们的类别(隐变量),这一步相当于E步。
一旦确定了类别之后,k-means就会将聚类中心转移到该类所有节点的平均处,
这么做的原因就是使得公式(1)最小,公式(1)可不可以理解成成本函数最小,这一步相当于M步。
4)基于mapreduce的k-means,一次迭代需要启动一次mapreduce过程。每次mapreduce过程,执行(2)(3)步骤。
基于mapreduce的k-means的算法流程如下:
输入:k, data[n](data应存在dfs里);
(1)本地选择k个初始中心点。c[]存入文件clusterlist;
(2)启动mapreduce过程,将文件clusterlist分发到各个节点。输入为存在dfs上的data,输出为dfs的dfs_clusterlist;
(3)map过程:输入data[k1,..,k2]。
对于data[k], 与c[0]…c[n-1]比较,假定与c[i]差值最少,就标记为i类。输出i,data[k]。i为key,data[k]为value;
(4)reduce过程:由于类别为key,则同一类别的所有data会输入同reduce并且紧邻。
这样我们可以重新计算c[i]={ 所有标记为i类的data[j]之和}/标记为i类的个数。将结果输出到res。
(5)本地抓取dfs_clusterlist。dfs_clusterlist与原有的clusterlist比较。
若变化小于给定阈值,则算法结束;反之,则用dfs_clusterlist替换clusterlist,跳转到(2)。
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
1)目标函数:
2) 终止条件:
一般是目标函数达到最优或者达到最大的迭代次数即可终止
3)K-means的算法流程如下:
1)随机确定K个中心位置。
2)将各个数据项分配给最邻近的中心点。
3)分配完成后,聚类中心会移到该类所有节点的平均位置处。
4)重复2)和3)直至结果不再变化
EM算法流程如下:
第一步是期望(E)步,利用当前已知参数值来估计最优隐变量的值。
第二步是最大化(M)步,就是寻找能使E步期望似然最大化的参数。
然后,新的参数值重新被用于E步,直到收敛到局部最优解。
回头来看k-means,这里我们的已知变量就是各个类的中心点ci,而隐变量就是物体的标签类别Ci,这是我们不知道的。
一开始我们会根据随机确定的中心点位置(已知变量)来确定他们的类别(隐变量),这一步相当于E步。
一旦确定了类别之后,k-means就会将聚类中心转移到该类所有节点的平均处,
这么做的原因就是使得公式(1)最小,公式(1)可不可以理解成成本函数最小,这一步相当于M步。
4)基于mapreduce的k-means,一次迭代需要启动一次mapreduce过程。每次mapreduce过程,执行(2)(3)步骤。
基于mapreduce的k-means的算法流程如下:
输入:k, data[n](data应存在dfs里);
(1)本地选择k个初始中心点。c[]存入文件clusterlist;
(2)启动mapreduce过程,将文件clusterlist分发到各个节点。输入为存在dfs上的data,输出为dfs的dfs_clusterlist;
(3)map过程:输入data[k1,..,k2]。
对于data[k], 与c[0]…c[n-1]比较,假定与c[i]差值最少,就标记为i类。输出i,data[k]。i为key,data[k]为value;
(4)reduce过程:由于类别为key,则同一类别的所有data会输入同reduce并且紧邻。
这样我们可以重新计算c[i]={ 所有标记为i类的data[j]之和}/标记为i类的个数。将结果输出到res。
(5)本地抓取dfs_clusterlist。dfs_clusterlist与原有的clusterlist比较。
若变化小于给定阈值,则算法结束;反之,则用dfs_clusterlist替换clusterlist,跳转到(2)。