消息不适合sklearn k均值收敛实现

时间:2019-11-19 18:44:12

标签: python scikit-learn k-means

为了在基于张量流的k-means实现中重复使用scikit-learn KMeans中实现的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 大)。< / p>

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

1 个答案:

答案 0 :(得分:1)

我找到了。转到文件:_k_means_elkan.pyx第243行(在0.23.1中)。在master分支中将是第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而不是平方。