Этот вопрос касается создания графа K-ближайших соседей [KNNG] из набора данных с неизвестным числом центроидов (что не совпадает с кластеризацией K-средних).
Предположим, у вас есть набор данных наблюдений, сохраненный в матрице данных X[n_samples, n_features]
, где каждая строка является вектором наблюдения или объекта, а каждый столбец является объектом. Теперь предположим, что вы хотите вычислить (взвешенный) график k-Neighbours для точек в X, используя sklearn.neighbors.kneighbors_graph .
Каковы основные c методы для выбора количества соседей для использования в каждой выборке? Какие алгоритмы хорошо масштабируются, когда у вас много наблюдений?
Я видел этот метод грубой силы ниже, но он не работает, когда размер набора данных выборки становится большим, и вы должны выбрать хорошую начальную верхнюю границу для n_neighbors_max
. У этого алгоритма есть имя?
def autoselect_K(X, n_neighbors_max, threshold):
# get the pairwise euclidean distance between every observation
D = sklearn.metrics.pairwise.euclidean_distances(X, X)
chosen_k = n_neighbors_max
for k in range(2, n_neighbors_max):
k_avg = []
# loop over each row in the distance matrix
for row in D:
# sort the row from smallest distance to largest distance
sorted_row = numpy.sort(row)
# calculate the mean of the smallest k+1 distances
k_avg.append(numpy.mean(sorted_row[0:k]))
# find the median of the averages
kmedian_dist = numpy.median(k_avg)
if kmedian_dist >= threshold:
chosen_k = k
break
# return the number of nearest neighbors to use
return chosen_k