K означает кластеризацию: функция обновления центроида каждого кластера и выбора цвета - PullRequest
1 голос
/ 07 мая 2020

Это отрывок из примера кластеризации K-средств, который я прохожу. Кто-нибудь может помочь мне понять, что происходит в последних двух строках, пожалуйста?

Конкретно:

  1. Что делает class_of_points = compare_to_first_center > compare_to_second_center? Это просто возвращает логическое значение?
  2. Также в следующей строке, что делает colors_map[class_of_points + 1 - 1]?

Заранее спасибо, ребята.

import random # library for random number generation
import numpy as np # library for vectorized computation
import pandas as pd # library to process data as dataframes

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans 
from sklearn.datasets.samples_generator import make_blobs

# data
x1 = [-4.9, -3.5, 0, -4.5, -3, -1, -1.2, -4.5, -1.5, -4.5, -1, -2, -2.5, -2, -1.5, 4, 1.8, 2, 2.5, 3, 4, 2.25, 1, 0, 1, 2.5, 5, 2.8, 2, 2]
x2 = [-3.5, -4, -3.5, -3, -2.9, -3, -2.6, -2.1, 0, -0.5, -0.8, -0.8, -1.5, -1.75, -1.75, 0, 0.8, 0.9, 1, 1, 1, 1.75, 2, 2.5, 2.5, 2.5, 2.5, 3, 6, 6.5]

#Define a function that updates the centroid of each cluster

colors_map = np.array(['b', 'r'])
def assign_members(x1, x2, centers):

    compare_to_first_center = np.sqrt(np.square(np.array(x1) - centers[0][0]) + np.square(np.array(x2) - centers[0][1]))
    compare_to_second_center = np.sqrt(np.square(np.array(x1) - centers[1][0]) + np.square(np.array(x2) - centers[1][1]))
    class_of_points = compare_to_first_center > compare_to_second_center
    colors = colors_map[class_of_points + 1 - 1]
    return colors, class_of_points

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

compare_to_first_center - это расстояние от всех точек до centers[0], и аналогично compare_to_second_center - это расстояние от всех точек до centers[1]. Теперь class_of_points - это логический массив того же размера, что и ваши точки, в котором указано, находится ли каждая точка ближе к center[0] или centers[1]. Если class_of_points[i] равно True, point[i] в ваших данных ближе к centers[0].

colors = colors_map[class_of_points + 1 - 1] назначает цвет b или r точкам, b, если они ближе к centers[1] и r для centers[0]. Обратите внимание, что для преобразования булевой маски class_of_points в массив индексов они добавляют 1 и вычитают 1, так что на выходе False как 0 и True преобразуется в 1, что делает их индексами. Пример:

np.array([True, False, True])+1-1 

совпадает с

[1, 0, 1]

В качестве альтернативы вы можете просто заменить его на:

colors = colors_map[class_of_points + 0]
0 голосов
/ 07 мая 2020

Кажется, даны два списка центров. Этот код будет вычислять евклидово расстояние для каждой точки до каждой центральной точки и присваивает синий цвет тем, которые находятся ближе к центральной точке в centers[0][:], и красный цвет точкам ближе к центральным точкам в centers[1][:].

def assign_members(x1, x2, centers):

    # In the following two lines, the eucledean distances are being calculated
    compare_to_first_center = np.sqrt(np.square(np.array(x1) - centers[0][0]) + np.square(np.array(x2) - centers[0][1]))
    compare_to_second_center = np.sqrt(np.square(np.array(x1) - centers[1][0]) + np.square(np.array(x2) - centers[1][1]))

    # Check which center is closer to each point
    # So class_of_points is a binary arary specifies the class number
    class_of_points = compare_to_first_center > compare_to_second_center

    # Depending on the class number (i.e. 0 or 1) it chooses the colour (blue or red)
    colors = colors_map[class_of_points + 1 - 1]
    return colors, class_of_points
...