【问题标题】:How to perform elbow method in python?如何在python中执行肘法?
【发布时间】:2019-04-19 06:45:23
【问题描述】:

我想使用肘法检查最佳 k 数。我没有使用 scikit-learn 库。我的 k-means 是从头开始编写的,现在我很难弄清楚如何在 python 中编写肘部方法。我是个初学者。

这是我的 k-means 代码:


def cluster_init(array, k):

    initial_assgnm = np.append(np.arange(k), np.random.randint(0, k, size=(len(array))))[:len(array)]
    np.random.shuffle(initial_assgnm)
    zero_arr = np.zeros((len(initial_assgnm), 1))

    for indx, cluster_assgnm in enumerate(initial_assgnm):
        zero_arr[indx] = cluster_assgnm
    upd_array = np.append(array, zero_arr, axis=1)

    return upd_array


def kmeans(array, k):

    cluster_array = cluster_init(array, k)


    while True:
        unique_clusters = np.unique(cluster_array[:, -1])

        centroid_dictonary = {}
        for cluster in unique_clusters:
            centroid_dictonary[cluster] = np.mean(cluster_array[np.where(cluster_array[:, -1] == cluster)][:, :-1], axis=0)


        start_array = np.copy(cluster_array)


        for row in range(len(cluster_array)):
            cluster_array[row, -1] = unique_clusters[np.argmin(
                [np.linalg.norm(cluster_array[row, :-1] - centroid_dictonary.get(cluster)) for cluster in unique_clusters])]

        if np.array_equal(cluster_array, start_array):
            break

    return centroid_dictonary

这是我尝试过的肘部方法:

cost = []
K= range(1,239)
for k in K :
    KM = kmeans(x,k)
    print(k)
    KM.fit(x)
    cost.append(KM.inertia_)

但我收到以下错误

KM.fit(x)

AttributeError: 'dict' 对象没有属性 'fit'

【问题讨论】:

  • KM 没有 fit 方法,因为它只是一个普通的 python 字典。如果您不想使用库,则需要计算质心字典的惯性,即。 e.编写一个 compute_inertia(KM) 函数

标签: machine-learning k-means


【解决方案1】:

如果您想从头开始计算肘部值,则需要计算当前聚类分配的惯性。为此,您可以计算粒子惯性的总和。数据点的粒子惯性是从其当前位置到最近中心的距离。如果你有一个为你计算这个的函数(在 scikit-learn 中这个函数对应于pairwise_distances_argmin_min)你可以这样做

labels, mindist = pairwise_distances_argmin_min(
    X=X, Y=centers, metric='euclidean', metric_kwargs={'squared': True})
inertia = mindist.sum()

如果你真的想写这个函数,你要做的就是遍历 X 中的每一行 x,找到 dist(x,y) 的 Y 中所有 y 的最小值,这就是你对 x 的惯性。这种计算粒子惯性的简单方法是 O(nk),因此您可以考虑使用库函数。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2012-07-26
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多