Я проходил курс машинного обучения, имея базовые знания о Python, следуя примеру из книги «На пути к науке о данных» о кластеризации K-средних, и есть способ индексации, о котором я не спрашивал профессора во время лекции. Источник Это та часть, где строится график с центроидами, автор использует индексацию, например:
plt.scatter(
X[y_km == 2, 0], X[y_km == 2, 1],
s=50, c='lightblue',
marker='v', edgecolor='black',
label='cluster 3'
)
Кто-нибудь знает, как это работает?
Я пробовал делать это за пределами plt.scatter
, и это не помогает больше, чем то, что я уже знаю.
@Chris Да, извините, может быть, я недостаточно ясно выразился, но да, я имел в виду библиотеку matplotlib. Я попытался добавить тег, чтобы сделать его более понятным.
Вот статья, которая поможет вам лучше понять индексацию ndarray: Индексация на ndarrays
Итак, в вашем примере X
есть 2dim ndarray с n строками и 2 столбцами — feature1 и feature2.
Простой пример:
x = np.arange(20).reshape(10, 2)
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15],
[16, 17],
[18, 19]])
и простой пример y
- список классов:
y = np.array([1, 2] * 5)
array([1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
Предположим, вы хотите получить все строки из массива X, которые соответствуют классу 1. Вы можете просто сделать это, используя логическое индексирование массива следующим образом:
x[y == 1]
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17]])
Но если вы хотите получить все строки одного определенного столбца, вам нужно использовать размерную индексацию:
x[y == 1, 0] # all rows of feature1 (0 index) corresponding to class 1
array([ 0, 4, 8, 12, 16])
Итак, здесь y == 1
— все строки, а 0
— индекс интересующего вас столбца.
X
представляет собой массив из 2 столбцов. Вы можете думать о них как о координатах x
и y
.
Распечатав первые 10 строк, вы увидите:
print(X[0:10])
[[ 2.60509732 1.22529553]
[ 0.5323772 3.31338909]
[ 0.802314 4.38196181]
[ 0.5285368 4.49723858]
[ 2.61858548 0.35769791]
[ 1.59141542 4.90497725]
[ 1.74265969 5.03846671]
[ 2.37533328 0.08918564]
[-2.12133364 2.66447408]
[ 1.72039618 5.25173192]]
y_km
— классификация этих координат.
В примере они классифицируются как 0
, 1
или 2
.
print(y_km[0:10])
[1 0 0 0 1 0 0 1 2 0]
Но когда у вас есть y_km == 1
, они преобразуются в список логических значений.
print((y_km==1)[0:10])
[ True False False False True False False True False False]
Поэтому, когда вы звоните
X[y_km == 1 , 1]
По сути, вы просите выбрать значения y_km
, равные 1
, и сопоставить их со столбцом 1
массива X. Он захватит только те строки, для которых y_km
равно True, и получит только значение из указанного столбца (т.е. 1)
X[y_km == 2, 0]
Значения y_km, равные 2
, сопоставляются со столбцом 0
массива X.
Таким образом, первое число относится к группе классификации, которую вы хотите собрать, а второе число относится к столбцу массива X, из которого вы хотите получить данные.
"Python's plt" не при чем. Вы имеете в виду
matplotlib.pyplot
? Его часто импортируют какplt
, но это не так.