You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于自定义度量的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:07:27