带权重的向量相似度计算方法咨询
加权向量相似度计算方案
针对你需要为向量不同维度赋予差异化权重的场景,最适配现有余弦相似度逻辑的方案是加权余弦相似度——通过对向量各维度元素先乘以对应权重,再执行常规的余弦相似度计算,从而放大重要维度对相似度结果的影响。以下是具体实现思路和修改后的代码:
核心思路
- 定义与向量维度匹配的权重数组,权重值越高,对应维度在相似度计算中的占比越大;
- 将目标向量和所有对比向量的每个元素与对应权重相乘,得到加权后的向量;
- 对加权后的向量执行常规的归一化和余弦相似度计算即可。
修改后的代码实现
import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 待对比目标向量 propuesto = np.array([20, 85, 10, 10]) # 对比向量集合 vector_b1 = np.array([31, 83, 22, 88.5]) vector_b2 = np.array([25.4, 114.07, 18.2, 346.68]) vector_b3 = np.array([26.9, 85, 20.9, 123.87]) vector_b4 = np.array([25.7, 87.6, 20.96, 458.8]) vector_b5 = np.array([28.6, 71.4, 28.9, 690.5]) vector_b6 = np.array([30.2, 148.9, 26.33, 317.58]) vector_b7 = np.array([25.1, 87.8, 0, 0]) vector_b8 = np.array([32.4, 158.9, 23.33, 160.14]) vector_b9 = np.array([23, 89.4, 17.99, 561]) vector_b10 = np.array([16.64, 36.7, 27.8, 526]) vector_b11 = np.array([40, 85, 10, 10]) # 转换为矩阵格式 matriz_b = np.array([vector_b1, vector_b2, vector_b3, vector_b4, vector_b5, vector_b6, vector_b7, vector_b8, vector_b9, vector_b10, vector_b11]) # 定义各维度权重(按业务需求调整,数值越大对应维度越重要) weights = np.array([0.5, 1.0, 0.3, 0.2]) # 示例:第二个维度权重最高 # 对向量应用权重:每个元素乘以对应维度的权重 propuesto_weighted = propuesto * weights matriz_b_weighted = matriz_b * weights # 归一化加权后的目标向量 vector_a_norm = propuesto_weighted / np.linalg.norm(propuesto_weighted) # 归一化加权后的对比矩阵 matriz_b_norm = matriz_b_weighted / np.linalg.norm(matriz_b_weighted, axis=1, keepdims=True) # 计算加权余弦相似度 similitudes = cosine_similarity([vector_a_norm], matriz_b_norm) # 输出相似度结果 for i, similitud in enumerate(similitudes[0]): print(f"与向量B{i + 1}的加权相似度: {similitud:.4f}")
额外说明
- 权重无需预先归一化,只需保证权重为正数即可,业务上直接按相对重要性设置数值;
- 若不想依赖sklearn库,可手动实现加权余弦相似度公式:
def weighted_cosine_similarity(a, b, weights): a_weighted = a * weights b_weighted = b * weights dot_product = np.dot(a_weighted, b_weighted) norm_a = np.linalg.norm(a_weighted) norm_b = np.linalg.norm(b_weighted) return dot_product / (norm_a * norm_b)
内容的提问来源于stack exchange,提问作者Miguel JV
相关产品推荐
相关产品推荐

