KNN 模型 returns 与任意 k 的距离相同

KNN model returns same distances with any k

我正在尝试使用 knn 创建一个基于项目的基本推荐系统。但是使用下面的代码,它总是 returns 与模型的不同 k 的相同距离。为什么 returns 结果相同?

df_ratings = pd.read_csv('ml-1m/ratings.dat', names=["user_id", "movie_id", "rating", "timestamp"],
            header=None, sep='::', engine='python')
matrix_df = df_ratings.pivot(index='movie_id', columns='user_id', values='rating').fillna(0).astype(bool).astype(int)

um_matrix = scipy.sparse.csr_matrix(matrix_df.values)

# knn model
model_knn = NearestNeighbors(metric='cosine', algorithm='brute', n_neighbors=17, n_jobs=-1)
model_knn.fit(um_matrix)

distances, indices = model_knn.kneighbors(um_matrix[int(movie)], n_neighbors=100)

您的模型 returns 任何 K 的距离都相同,因为您的 K 不会改变数据点之间的距离。

K-Nearest-Neigbours 只是在您的 特征 space 中找到一个点的最近邻点,K 确实指定 多少 个您要查找的对象,而不是 他们彼此相距多远

一个简单的例子是

X = [[0,0],[0,5],[5,0],[5,5][4,4]] 

作为散点图,它看起来像

因此您的距离矩阵定义了所有点之间的距离:

   [0,0]:  [0.        , 5.        , 5.        , 5.65685425, 7.07106781],
   [0,5]:  [0.        , 4.12310563, 5.        , 5.        , 7.07106781],
   [5,0]:  [0.        , 4.12310563, 5.        , 5.        , 7.07106781],
   [5,5]:  [0.        , 1.41421356, 5.        , 5.        , 7.07106781],
   [4,4]:  [0.        , 1.41421356, 4.12310563, 4.12310563, 5.65685425]]

第一行显示点[0,0]到任何其他点的距离

  • 它自己是 0
  • 到[0,5]的距离是5
  • 到[5,0]的距离是5
  • 到 [4,4] 它的(在我的例子中是 euklidian 距离)的平方根 4*4+4*4 所以 5.65..
  • 到[5,5]的欧氏距离是7.07106781

因此无论您要查找多少个点 (K),距离总是相同的。