[Искусственный интеллект плиты] Машинное обучение 029 - Найди ближайшего соседа
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)
Основная идея алгоритма ближайшего соседа: чтобы определить, к какой категории вы принадлежите, сначала найдите K ближайших к вам соседей, и посмотрите, к какой категории относится большинство этих соседей, после чего вас можно считать принадлежащим к этой категории .
Итак, согласно этой основной идее, есть три важных фактора: метрика расстояния, размер K и правила классификации. В KNN, когда набор обучающих данных и три элемента определены, это эквивалентно разделению пространства признаков на некоторые подпространства. Для измерения расстояния существует много способов, наиболее часто используется расстояние Минковского, а формула его расчета:
Где P>=1, когда P=2, это евклидово расстояние, а когда p=1, это манхэттенское расстояние.
Выбор размера K является важным соображением, и его выбор может оказать существенное влияние на результаты алгоритма. Если K слишком мало, это эквивалентно использованию обучающих примеров в меньшем поле для предсказания, на которое будет влиять шум и при этом дисперсия относительно велика, то есть переобучение модели будет более серьезным. Если K слишком велико, это эквивалентно использованию большого количества соседей для оценки, и в это время он впадет в другую крайность, что приведет к недостаточной подгонке модели.
В конкретных приложениях обычно выбирается маленькое значение K, а K является нечетным числом, и обычно используется метод перекрестной проверки для получения наиболее подходящего значения K.
В правилах классификации обычно используется мажоритарное голосование, то есть категория, к которой относится большинство экземпляров, считается категорией новой выборки. Это легко понять.
1. Найдите K ближайших соседей
Ниже мы используем код, чтобы найти K ближайших соседей новой выборки и посмотреть, где эти соседи.
# 1,寻找最近的K个邻居
from sklearn.neighbors import NearestNeighbors
# 自定义一些数据集
X = np.array([[1, 1], [1, 3], [2, 2], [2.5, 5], [3, 1],
[4, 2], [2, 3.5], [3, 3], [3.5, 4]])
# 画出这些数据集在平面图上的分布情况
plt.scatter(X[:,0],X[:,1],marker='o',color='k')
# 一个新样本
new_sample=np.array([[2.6,1.7]])
plt.scatter(new_sample[:,0],new_sample[:,1],marker='*',color='r')
Вышеприведенное просто отображает распределение исходного набора данных и новых выборок на двумерной плоскости, но не вычисляет их ближайшие расстояния и соседей. Следующий код представляет собой процесс расчета.
# 构建KNN模型,计算最近的K个数据点
K=3
KNN=NearestNeighbors(n_neighbors=K,algorithm='ball_tree').fit(X)
distances,indices=KNN.kneighbors(new_sample)
# 打印最近的K个邻居
for rank, (indices, distance) in \
enumerate(zip(indices[0][:K],distances[0][:K])):
print('rank: {} --> {}, distance: {:.3f}'.format(rank, X[index],distance))
---------------------------- потерять --------- выход ----------- - ---------------------
rank: 0 --> [2. 2.], distance: 0.671 rank: 1 --> [3. 1.], distance: 0.806 rank: 2 --> [3. 3.], distance: 1.360
----------------------------------Заканчивать--------------- ----------------------
Видно, что тремя ближайшими соседями к новой выборке являются [2,2], [3,1], [3,3], и соответствующие расстояния также напечатаны. На самом деле массив индексов, возвращаемый KNN.kneighbors(new_sample), является отсортированным массивом, нам просто нужно получить из него индекс.
Далее для удобства наблюдения ближайшие K соседей выделены другим цветом.
########################резюме########################## ######
1. Чтобы найти ближайшие K соседей новой выборки, нужно сначала построить модель KNN, а затем обучить модель на наборе данных.
2. Затем с помощью функции KNN.kneighbors(new_sample) получить сортировку расстояний, и по этим сортировкам можно вычислить K ближайших соседей.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.