[Искусственный интеллект плиты] Машинное обучение 029 - Найди ближайшего соседа

машинное обучение искусственный интеллект Python алгоритм

[Искусственный интеллект плиты] Машинное обучение 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 соседей выделены другим цветом.

最近的K个邻居

########################резюме########################## ######

1. Чтобы найти ближайшие K соседей новой выборки, нужно сначала построить модель KNN, а затем обучить модель на наборе данных.

2. Затем с помощью функции KNN.kneighbors(new_sample) получить сортировку расстояний, и по этим сортировкам можно вычислить K ближайших соседей.

#################################################################


Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.