如何使用嵌套循环移除矩阵对角项后计算样本成对距离的中位数
核矩阵计算与中位数统计问题解答
核矩阵维度问题解答
可以从100×1的输入得到100×100的矩阵。核矩阵本身的维度与样本数量一致,为n×n格式,其中第i行第j列的元素对应第i个和第j个样本的核函数计算结果。你只需要遍历所有i、j组合,用你提到的3维空间点积方法计算k(X[i], X[j]),把结果填入对应位置即可得到目标矩阵。
中位数计算代码修复
你原有代码存在以下问题:
- 函数定义名和调用名不一致,定义的是
median_cal,调用时写的是median_distance dist初始化代码被注释,且列表推导式没有实际给dist元素赋值的逻辑,空跑无效果- 错误将已生成的距离矩阵传入
distance.pdist,该方法本身是用来计算输入样本的两两距离,不需要二次处理已生成的距离矩阵
修复后代码
首先导入依赖:
import numpy as np from scipy.spatial import distance
按你的要求初始化dist变量的实现:
def median_cal(X): # X: n*1 matrix # 初始化n×n维度的dist空矩阵 dist = np.empty((len(X), len(X)), float) n = len(X) # 填充dist矩阵为两两样本的欧氏距离 for i in range(n): for j in range(n): dist[i, j] = np.linalg.norm(X[i] - X[j]) # 提取非对角元素(移除i=j的对角项) non_diag_items = dist[~np.eye(n, dtype=bool)] # 计算中位数 h = np.median(non_diag_items) return h h = median_cal(np.array([[1],[2],[4]])) print('final: h') print(h) # 输出为2.0,符合预期
内容的提问来源于stack exchange,提问作者Adam Rainah
相关产品推荐
相关产品推荐

