我有以下向量:
import numpy as np
my_vector = np.array([0.001, -0.05, 0.3, 0.5, 0.01, -0.03])
有没有人能提出一种方法来随机生成类似的向量,只是值略有不同?例如,期望的输出将是:
[0.002, -0.06, 0.2, 0.4, 0.02, -0.02]
为了给予一些上下文,这个向量表示我输入到分类模型中的样本。我的计划是随机生成一组相似的样本,并将它们输入同一个模型,以观察其输出的变化。最终目标是验证模型是否为相似的样本生成相似的输出。
我尝试Create random vector given cosine similarity并将所需的余弦相似度设置为1,但使用此方法只能获得一个相似向量(见下文)。我需要至少10个。
def rand_cos_sim(v, costheta):
# Form the unit vector parallel to v:
u = v / np.linalg.norm(v)
# Pick a random vector:
r = np.random.multivariate_normal(np.zeros_like(v), np.eye(len(v)))
# Form a vector perpendicular to v:
uperp = r - r.dot(u)*u
# Make it a unit vector:
uperp = uperp / np.linalg.norm(uperp)
# w is the linear combination of u and uperp with coefficients costheta
# and sin(theta) = sqrt(1 - costheta**2), respectively:
w = costheta*u + np.sqrt(1 - costheta**2)*uperp
return w
new_vector = rand_cos_sim(my_vector, 1)
print(new_vector)
# [ 0.00170622 -0.08531119 0.51186714 0.8531119 0.01706224 -0.05118671]
我没有一个特定的相似性度量,它可以是欧几里得,余弦,无论哪个效果最好。任何建议都非常欢迎。
请注意,我提供的my_vector
是为了说明的目的,实际上,我的向量会有不同的值范围,这取决于我测试的模型和不同的数据。
谢谢
4条答案
按热度按时间gab6jxml1#
我认为最好的方法是在两个值之间添加一个随机数。为了这个目的,看看random。
您可以通过调整值范围来对此进行调整
fquxozlt2#
也许我过于简单化了,但是你能不能生成和你的大小相同的随机向量,然后把它们加到你的向量上,使它们相似(或者加一,然后相乘,因为你的例子在较小的数字上变化较小)?
14ifxucb3#
您可以通过调用
numpy.random.lognormal
生成随机乘法因子。使用mean=0
和一个小值sigma
生成接近1的随机值。比如说,
kninwzqo4#
我不是Python程序员,但我可以看出你的问题很容易解决,只需记录起始向量的长度(vstart),生成另一个随机单位向量(vnew),然后将vnew乘以vstart的长度,你就会得到一个相同长度的向量。假设我们讨论的是3d向量,请遵循以下伪代码:
我想在Python中可能有一种方法可以在一行代码中完成所有这些,使用API和一些语言内置的功能。
如果您不需要完整的余弦相似性实现的功能,那么这要简单得多,并且执行时间更少。