nndeploy.base.similarity 源代码

import numpy as np

[文档]def histogram_data_distribution(data: np.ndarray, num_bins: int = 2048) -> np.ndarray: """统计数据分布并放入指定数量的箱子中 Args: data: 输入的numpy数组,表示需要统计的数据 num_bins: 箱子的数量,默认为2048 Returns: np.ndarray: 每个箱子的频数 """ # 计算直方图 histogram, bin_edges = np.histogram(data, bins=num_bins) return histogram
[文档]def cosine_similarity(array1: np.ndarray, array2: np.ndarray) -> float: """计算两个numpy数组的余弦相似度 余弦相似度用于衡量两个向量的相似程度,通过计算向量间夹角的余弦值得到。 结果范围在[-1,1]之间: 1: 表示两个向量方向完全相同,即最相似 0: 表示两个向量正交,即没有相似性 -1: 表示两个向量方向完全相反,即最不相似 计算公式为: cos(θ) = (A·B)/(||A||·||B||) 其中A·B为向量点积, ||A||和||B||分别为向量的模长 Args: array1: 第一个numpy数组 array2: 第二个numpy数组 Returns: float: 余弦相似度值,范围在[-1,1]之间 """ # 将数组展平为一维 array1_flat = array1.flatten() array2_flat = array2.flatten() # 计算点积 dot_product = np.dot(array1_flat, array2_flat) # 计算模长 norm1 = np.linalg.norm(array1_flat) norm2 = np.linalg.norm(array2_flat) # 避免除零错误 if norm1 == 0 or norm2 == 0: return 0.0 # 计算余弦相似度 similarity = dot_product / (norm1 * norm2) return similarity
[文档]def mse_similarity(array1: np.ndarray, array2: np.ndarray) -> float: """计算两个numpy数组的均方误差(MSE)相似度 均方误差用于衡量两个数组之间的差异程度。 MSE值越小表示两个数组越相似。 为了与余弦相似度保持一致的相似度表示: - 使用exp(-MSE)将结果映射到(0,1]区间 - 1表示完全相同(MSE=0) - 接近0表示差异很大(MSE很大) 计算公式为: MSE = mean((A-B)^2) 相似度 = exp(-MSE) Args: array1: 第一个numpy数组 array2: 第二个numpy数组 Returns: float: MSE相似度值,范围在(0,1]之间 """ # 将数组展平为一维 array1_flat = array1.flatten() array2_flat = array2.flatten() # 计算MSE mse = np.mean(np.square(array1_flat - array2_flat)) # 将MSE转换为相似度分数 similarity = np.exp(-mse) return similarity
[文档]def euclidean_similarity(array1: np.ndarray, array2: np.ndarray) -> float: """计算两个numpy数组的欧式距离相似度 欧式距离用于衡量两个数组在欧几里得空间中的距离。 为了与其他相似度保持一致: - 使用exp(-distance)将结果映射到(0,1]区间 - 1表示完全相同(距离为0) - 接近0表示差异很大(距离很大) 计算公式为: distance = sqrt(sum((A-B)^2)) 相似度 = exp(-distance) Args: array1: 第一个numpy数组 array2: 第二个numpy数组 Returns: float: 欧式距离相似度值,范围在(0,1]之间 """ # 将数组展平为一维 array1_flat = array1.flatten() array2_flat = array2.flatten() # 计算欧式距离 distance = np.sqrt(np.sum(np.square(array1_flat - array2_flat))) # 将距离转换为相似度分数 similarity = np.exp(-distance) return similarity