消息不适合 sklearn k-means 收敛实现
message does not fit sklearn k-means convergence implementation
为了将在 scikit-learn KMeans 中实现的 k-means 收敛标准重新用于我基于 tensorflow 的 k-means 实现,我需要理解它,但我做了这个我很想拥有的观察结果解释:
KMeans 收敛于此消息:
Iteration 45, inertia 6.993125 center shift 2.610457e-03 within
tolerance 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 的值 小于或等于 时才打印消息 公差。正如您从输出中看到的那样,在我的 KMeans 运行 中情况并非如此(center_shift_total 实际上是 much 大于 tol).
这怎么会发生(或者我忽略了什么)?我注意到 "Converged at iteration" 部分也丢失了,但观察到的消息对我来说绝对没有意义。
我找到了。转到文件:_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
而不对其进行平方。
为了将在 scikit-learn KMeans 中实现的 k-means 收敛标准重新用于我基于 tensorflow 的 k-means 实现,我需要理解它,但我做了这个我很想拥有的观察结果解释:
KMeans 收敛于此消息:
Iteration 45, inertia 6.993125 center shift 2.610457e-03 within tolerance 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 的值 小于或等于 时才打印消息 公差。正如您从输出中看到的那样,在我的 KMeans 运行 中情况并非如此(center_shift_total 实际上是 much 大于 tol).
这怎么会发生(或者我忽略了什么)?我注意到 "Converged at iteration" 部分也丢失了,但观察到的消息对我来说绝对没有意义。
我找到了。转到文件:_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
而不对其进行平方。