我有 N 个向量,以及所有 N*(N-1)/2 对之间的余弦相似度。我需要选择(所有向量对中的)K 个向量对,使得对 k(i)-k(i+1), i=1...K-1 之间的差异对于所有选定的 K 对来说更大或恒定。 我怀疑其中存在熵成分(删除尽可能多的元素以使熵的增加最小),但我不知道从哪里开始。
欢迎任何建议
最好的,
安德烈亚斯
为了解决这个问题,您需要根据余弦相似度差异来优化向量对的选择,旨在使这些差异尽可能均匀。
实现此目标的步骤:
1。计算余弦相似度差异: 假设您有一个长度为 N*(N-1)/2 的余弦相似度 cos_sim 数组。计算所有相似点对之间的差异。
2。对差异进行排序: 对这些差异进行排序以方便选择过程。
3.选择 K 对: 使用动态规划方法选择 K 对,目标是最小化所选对之间差异的方差。
使用Python的代码示例:
import numpy as np
import itertools
from scipy.spatial.distance import cosine
def calculate_cosine_similarities(vectors):
N = len(vectors)
cos_sim = []
for i, j in
itertools.combinations(range(N), 2):
cos_sim.append(1 - cosine(vectors[i],
vectors[j])) # Cosine similarity
return cos_sim
def calculate_differences(cos_sim):
diffs = []
for i in range(len(cos_sim)):
for j in range(i+1, len(cos_sim)):
diffs.append(abs(cos_sim[i] -
cos_sim[j]))
return diffs
def select_k_pairs(diffs, K):
diffs.sort()
# Initialize DP table
dp = [[float('inf')] * K for _ in
range(len(diffs))]
# Base case: selecting one element
for i in range(len(diffs)):
dp[i][0] = diffs[i]
for k in range(1, K):
for i in range(k, len(diffs)):
for j in range(k-1, i):
dp[i][k] = min(dp[i][k], dp[j][k-1] + (diffs[i] - diffs[j]))
# Backtrack to find the selected pairs
selected_pairs = []
i, k = len(diffs) - 1, K - 1
while k >= 0:
selected_pairs.append(diffs[i])
i -= 1
k -= 1
selected_pairs.reverse()
return selected_pairs
# Example usage
vectors = np.random.rand(10, 5) # 10
vectors of dimension 5
cos_sim =
calculate_cosine_similarities(vectors)
diffs = calculate_differences(cos_sim)
K = 5 # Number of pairs to select
selected_pairs = select_k_pairs(diffs, K)
print("Selected pairs with minimized
differences:", selected_pairs)