【问题标题】:message does not fit sklearn k-means convergence implementation消息不适合 sklearn k-means 收敛实现
【发布时间】:2020-03-15 09:02:27
【问题描述】:

为了将 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很多)。

这怎么会发生(或者我忽略了什么)?我注意到“迭代时收敛”部分也丢失了,但观察到的消息对我来说绝对没有意义。

【问题讨论】:

  • 您能告诉我们sklearn的版本吗,请使用:print(sklearn.__version__)。而且,你正在使用什么版本的 python。
  • 当然,Ubuntu 18.04 LTS 上的 sklearn 0.21.3 和 python 3.7.4

标签: python scikit-learn k-means


【解决方案1】:

我找到了。转到文件:_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 而不对其进行平方。

【讨论】:

  • 很好的发现!通过指定 algorithm="full" 我现在确实得到了预期的结果。 elkan 方法中的正方形是一个错误恕我直言,因为 elkan 应该提供与“完整”相同的结果,只是由于使用了三角不等式而减少了一些计算。我发现了这个相关(已关闭)问题:github.com/scikit-learn/scikit-learn/issues/9795
  • 你能制定一个 PR(去掉“** 2”)吗?
  • 不幸的是,它似乎更复杂:我在 scikit-learn 的一个分支中删除了“** 2”,但对于 algorithm="full" 和 algorithm="elkan 仍然得到不同的惯性_和 n_iter_ 值"分别。
  • @Barden 是的,我看过它,但我不确定它是如何工作的,我不认为我会为它提出拉取请求。
  • 我创建了github.com/scikit-learn/scikit-learn/issues/15831(包括复制示例)
猜你喜欢
  • 2021-09-06
  • 2016-02-09
  • 2017-07-28
  • 2022-01-15
  • 1970-01-01
  • 2020-01-31
  • 2014-02-08
  • 2020-06-21
  • 2021-05-04
相关资源
最近更新 更多