python - 消息不适合 sklearn k-means 收敛实现
问题描述
为了将 scikit-learn KMeans 中实现的 k-means 收敛标准重新用于我的基于 tensorflow 的 k-means 实现,我需要理解它,但我做了这个观察,我很想解释一下:
KMeans 与此消息收敛:
迭代 45,惯性 6.993125 中心偏移2.610457e-03在公差8.374284e-06内
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/cluster/_k_means.py (第442ff行,函数_kmeans_single_lloyd)中的实现如下:
center_shift_total = squared_norm(centers_old - centers)
if center_shift_total <= tol:
if verbose:
print("Converged at iteration %d: "
"center shift %e within tolerance %e"
% (i, center_shift_total, tol))
break
仅当center_shift_total的值小于或等于tolerance的值时,才应打印该消息。正如您从输出中看到的那样,在我的 KMeans 运行中情况并非如此(center_shift_total实际上比tol大得多)。
这怎么会发生(或者我忽略了什么)?我注意到“迭代时收敛”部分也丢失了,但观察到的消息对我来说绝对没有意义。
解决方案
我找到了。转到文件:_k_means_elkan.pyx
第 243 行(在 0.23.1 中)。在主分支中,它将是第 245 行。
if verbose:
print('Iteration %i, inertia %s'
% (iteration, np.sum((X_ - centers_[labels]) ** 2 *
sample_weight[:,np.newaxis])))
center_shift_total = np.sum(center_shift)
if center_shift_total ** 2 < tol:
if verbose:
print("center shift %e within tolerance %e"
% (center_shift_total, tol))
break
似乎它正在检查 的平方center_shift_total
。在内部k_means_.py
时,它正在检查center_shift_total
而不对其进行平方。
推荐阅读
- android - 通过 Web URL 安装 .apk 的意图
- python - xpath lxml无法获取html的ul标签内的所有元素
- javascript - JQUERY - 使用键从多维数组中删除数组
- python - 使用 Python 在 Excel 上自动关闭错误窗口
- php - 我在使用准备好的语句从数据库中获取数据时遇到问题
- ansible - 如何获取所有节点列表 IP 地址?
- python - 在 python pandas 中访问 csv 文件的 dict 列
- python - 从列表中删除元素并在同一语句中打印新列表
- html - MutationObserver:如何观察 flex child 的宽度/高度的变化?
- ruby-on-rails - 使用从属/辅助控制器上传图片