matlab - Matlab中的k-means算法给出错误答案?
问题描述
我有以下疑问:我正在使用 Matlab 的 k-means 函数,我只想使用 vanilla Lloyd 算法,以及我想要的一组初始化点。我使用以下代码,其中“开始”是我的初始化向量。
kmeans(data,[],'Start',start, 'OnlinePhase', 'off');
假设我的数据是 (-2,-1)X(2,1) 范围内的二维数据,我将起点初始化为 (-10,0) 和 (0,0)。理想情况下,我应该在一个集群中获得所有点,而在其他集群中没有,但是我在答案中获得了两个集群(因为 (-10,0) 真的很远,所以它应该在一次迭代中收敛)。这怎么可能?我在 Matlab 网站上阅读了 k-means 算法的描述,似乎这不应该是答案。
解决方案
没有一个点最接近错误选择的中心。所以无法重新计算,将被一个新的中心替换(参见文档)。首先将所有点分配给 0,0 簇。一些算法甚至会因为除以 0 而失败,或者丢弃这个中心并减少到 k=1。在 Matlab 中,您可以选择处理 - 默认情况下,它将选择离所有中心最远的点作为替换。
恕我直言,保持一个空的集群中心是相当合理的,因为它不会改变您在选择初始中心时想到的任何集群枚举,并且(当初始中心选择得当时)它甚至可能变为非空最终,当其他中心继续移动时(虽然不是在这里)。
推荐阅读
- aem - 如何导航到相应站点的错误页面(404 或 500)
- node.js - Jimp 裁剪图像
- haskell - 从保证至少包含一个 Just 的 [Maybe Bool] 中获得一个 Bool
- hibernate - 用新表中的新对象扩展现有的 Hibernate 对象
- python - Python BS4 不允许访问网页
- ios - Swift UI 单击导航栏链接隐藏状态栏在后面
- python - 在外部驱动器中安装 Python 的问题
- layout - Yii2:renderPartial 错误 => 第 1 行第 1 列的错误:文档为空
- linked-list - 使用嵌套 for 循环遍历大小为 n 的链表的时间复杂度
- terraform - 如何让 Terraform 用默认值替换空值?