我看了很多资料,关于设置值很多都是的说一下,对于我这个半路出家的,不好理解,所以自己一个一个的去找,然后理解,就把解释写得更清楚一点。
K-Means有两个缺点:
1.K值需要指定
2.初始点选取
K-Means ++就是要解决第二个问题的。
- k 表示期望的聚类的个数。
- maxInterations 表示方法单次运行最大的迭代次数。
- runs 表示算法被运行的次数。K-means 算法不保证能返回全局最优的聚类结果,所以在目标数据集上多次跑 K-means 算法,有助于返回最佳聚类结果。
- initializationMode 表示初始聚类中心点的选择方式, 目前支持随机选择或者 K-means||方式。默认是 K-means||。
- initializationSteps表示 K-means||方法中的步数。
- epsilon 表示 K-means 算法迭代收敛的阀值。
- seed 表示集群初始化时的随机种子。
- -------------------------------------------------------------------------------------------------
- 种子不同,产生不同的随机数。种子相同,即使实例不同也产生相同的随机数。
- 它这个k-means里面设置这个随机种子实际要它每次都生成不一样的数值出来,如果不设置这个随机种子数,那它默认随机种子数为1,导致每次执行都会是相同随机值,所以应该把随机种子设置为一个utils.random.nextlong(),生成均匀分布的种子数,每次调用的时候,random()里面对应的种子数是不同的数,导致出来的生成出来的随机值是不同的。
在同一台机器上,甭管运行多少次,所打印的随机数都是相同的,也就是说第一次运行,会打印出这三个随机数,第二次运行还是打印出同样的随机数,只要是在同一台硬件机器上,就永远都会打印出相同的随机数,似乎随机数不随机了,问题何在?
-
那是因为产生随机数的种子被固定了
-
------------------------------------------------------------------------------------------------------------------------
-
initializationSteps这个是k-means II是解决K-Means++的有序性问题,下一个中心点的选择依赖于已经选择的中心点。这使得算法无法并行扩展,极大地限制了算法在大规模数据集上的应用。
-
k-means II主要思路在于改变每次遍历时的取样策略,并非按照 k-means++ 那样每次遍历只取样一个样本,而是每次遍历取样 O(k) 个样本,重复该取样过程大约 O(logn) 次,重复取样过后共得到 O(klogn) 个样本点组成的集合,该集合以常数因子近似于最优解,然后再聚类这 O(klogn) 个点成 k 个点,最后将这 k 个点作为初始聚类中心送入Lloyd迭代中,实际实验证明 O(logn) 次重复取样是不需要的,一般5次重复取样就可以得到一个较好的聚类初始中心。
-