Как выполнить метод локтя в питоне? - PullRequest
1 голос
/ 19 апреля 2019

Я хочу проверить оптимальное количество k, используя метод локтя.Я не использую библиотеку scikit-learn.У меня есть мои k-средства с нуля, и теперь мне трудно понять, как кодировать метод elbow в python.Я абсолютный новичок.

Это мой код k-средних:


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'

1 Ответ

1 голос
/ 19 апреля 2019

Если вы хотите вычислить значения колен с нуля, вам нужно вычислить инерцию для текущего назначения кластеризации.Для этого вы можете вычислить сумму инерций частицы.Инерция частицы от точки данных - это расстояние от ее текущего положения до ближайшего центра.Если у вас есть функция, которая вычисляет это для вас (в 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 найдите минимум по всем y в Y в dist (x, y), и это будет ваша инерция для x.Этот наивный метод вычисления инерции частиц - это O (nk), так что вы можете вместо этого использовать библиотечную функцию.

...