Я работаю с набором данных среднего размера (shape=(14013L, 46L)
). Я хочу сгладить каждый образец с его knn. Я тренирую свою модель с помощью:
NearestNeighbors(n_neighbors, algorithm='ball_tree',
metric=sklearn.metrics.pairwise.cosine_distances)
А гладкость следующая:
def smooth(x,nbrs,data,alpha):
"""
input:
alpha: the smoothing factor
nbrs: trained NearestNeighbors from sklearn
data: the original data
(since NearestNeighbors returns only the index and not the samples)
x: what we want to smooth
output:
smoothed x with its nearest neighbours
"""
distances, indices = nbrs.kneighbors(x)
distances = map(lambda z:abs(-z+1),distances)[0]
norm = sum(distances)
if norm == 0:
"No neighbours were found."
return x
distances = map(lambda z: (1-alpha)*z/norm ,distances)
indices = map(lambda z: data[z],indices)[0]
other = np.array([indices[i] * distances[i] for i in range(len(distances))])
z = x * alpha
z = z.reshape((1,z.shape[0]))
smoothed = sum(np.concatenate((other,z),axis=0))
return smoothed
Мои вопросы:
- Как это возможно, что соседи не были найдены? (Я испытал это на своем наборе данных, поэтому условие
if
) - Подгонка ("обучение") занимает 18 секунд, а сглаживание ~1000 образцов занимает более 20 минут. Я готов получить менее точные результаты, если процесс сглаживания будет короче. Является ли это возможным? какие параметры следует изменить чтобы этого добиться?
NearestNeighbors
- person omerbp   schedule 12.06.2015