基于自定义度量的2D PCA索引KDTree查询维度不匹配问题
解决KDTree查询时的维度不匹配ValueError错误
问题背景
需求:基于自定义度量,利用KDTree快速查找PCA输出的2D索引。
运行时触发ValueError,错误提示:query data dimension must match training data dimension
报错回溯
ValueError Traceback (most recent call last) /tmp/ipykernel_9428/753399497.py in <cell line: 0>() 50 return 10.0 51 ---> 52 matriks_jarak = metrics(Matrix.values, Matrix.values, 5) 53 54 model = knn(n_neighbors=6, metric="precomputed") /tmp/ipykernel_9428/753399497.py in metrics(x, x2, n_tetangga) 31 def metrics(x, x2, n_tetangga): 32 global ind, jarak, ind0_nya, rigth_arr, sudah_print ---> 33 ind_x = pohon.query(x.reshape(1, -1), k=1, return_distance=False)[0][0] 34 ind_x2 = pohon.query(x2.reshape(1, -1), k=1, return_distance=False)[0][0] 35 jarak_final = jarak.tolist()[0] sklearn/neighbors/_binary_tree.pxi in sklearn.neighbors._kd_tree.BinaryTree64.query() ValueError: query data dimension must match training data dimension
最小可复现示例(MRE)
import numpy as np from sklearn.neighbors import KDTree dummy = np.array([[1.0, 2.0], [7.0, 6.0]]) # 训练数据是2维特征(每个样本2个特征) tree = KDTree(dummy) def custom(x, x2): return tree.query(x.reshape(1, -1), k=1, return_distance=False)[0][0] # 传入了4维的查询数据,导致维度不匹配 custom(np.array([0, 8, 9, 0]), 0)
示例报错信息
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) /tmp/ipykernel_10831/3966020442.py in <cell line: 0>() 8 return tree.query(x.reshape(1, -1), k=1, return_distance=False)[0][0] 9 ---> 10 custom(np.array([0, 8, 9, 0]), 0) /tmp/ipykernel_10831/3966020442.py in custom(x, x2) 6 7 def custom(x, x2): ----> 8 return tree.query(x.reshape(1, -1), k=1, return_distance=False)[0][0] 9 10 custom(np.array([0, 8, 9, 0]), 0) sklearn/neighbors/_binary_tree.pxi in sklearn.neighbors._kd_tree.BinaryTree64.query() ValueError: query data dimension must match training data dimension
错误原因
KDTree的训练数据是2维特征(每个样本包含2个数值),但查询时传入的是4维特征的数组,即使通过reshape(1,-1)调整形状,得到的是(1,4)的查询样本,和训练数据的特征维度(2)不匹配,因此触发维度不匹配的错误。
解决方案
确保查询数据的特征维度与KDTree训练数据的特征维度完全一致:
- 如果你的场景是处理PCA输出的2D数据,查询样本必须先经过相同的PCA降维处理,得到2维特征后再传入KDTree查询;
- 检查传入查询函数的数组形状,避免误传入高维数据。
修正后的示例代码
import numpy as np from sklearn.neighbors import KDTree dummy = np.array([[1.0, 2.0], [7.0, 6.0]]) tree = KDTree(dummy) def custom(x, x2): return tree.query(x.reshape(1, -1), k=1, return_distance=False)[0][0] # 传入2维的查询数据,与训练数据维度匹配 custom(np.array([0, 8]), 0)
运行修正后的代码,将返回训练数据中与[0,8]最近邻的样本索引(此处为1,对应[7.0,6.0])。
内容的提问来源于stack exchange,提问作者Fia Shofia Zahra
相关产品推荐
相关产品推荐

