适用于大多数不同向量的 Python 例程

问题描述 投票:0回答:1

我有 N 个向量,以及所有 N*(N-1)/2 对之间的余弦相似度。我需要选择(所有向量对中的)K 个向量对,使得对 k(i)-k(i+1), i=1...K-1 之间的差异对于所有选定的 K 对来说更大或恒定。 我怀疑其中存在熵成分(删除尽可能多的元素以使熵的增加最小),但我不知道从哪里开始。

欢迎任何建议

最好的,

安德烈亚斯

python vector entropy
1个回答
0
投票

为了解决这个问题,您需要根据余弦相似度差异来优化向量对的选择,旨在使这些差异尽可能均匀。

实现此目标的步骤:

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)
© www.soinside.com 2019 - 2024. All rights reserved.