-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
N维空间两随机向量的问题 #15
Comments
N=2 的情况比较好解释 但是要推广的话还是用n-sphere上的均匀分布的余弦会比较好算。 |
由于P(S)dS = P(x)dx,且P(S)是均匀分布,所以P(x) = 1 * dS/dx。因此只需考察高维球面的dS/dx便可解出向量夹角cosine的分布。高维球面面积和体积的讨论参见wiki-n-sphere,且与Gamma函数有关。所以n=3的情况可以从这个角度再作理解。 |
我感觉 @guofei9987 的本意是空间里任意两个向量吧,不一定是球面上的。不过球面上是不是有类似的结论倒是也可以讨论看看。 |
补充一下,一开始,我把“随机向量”定义为“多维正方形”中任取一点,但后来发现把“随机变量”定义为“多维球内任意一点”或者定义为“多维球面上任意一点”,从图像上看,结论似乎不变。 也就是说,从以下三种集合中做随机模拟实验,看起来结论一致:
下面是代码 多维正方形的: # %%方形随机
import numpy as np
import matplotlib.pyplot as plt
n_dim = 3
cos_all = []
for i in range(10000):
vec_1 = np.random.rand(n_dim) - 0.5
vec_2 = np.random.rand(n_dim) - 0.5
cos_tmp = (sum(vec_1 * vec_2)) / np.sqrt(sum(vec_1 ** 2) * sum(vec_2 ** 2))
cos_all.append(cos_tmp)
plt.hist(cos_all)
plt.show() 多维球面不太容易模拟,似乎应该再开一个 issue 讨论一下“如何在任意曲面上随机选取一点,以达成曲面上的随机分布”
奇怪之处是,球体上的结论,与正方体上的结论似乎一致:n_dim=3时,余弦值近似均匀分布。 |
用公式做一下恒等变换: 这样,问题转化为,上面这个式子的分布律如何计算的问题 作为验证: import numpy as np
import matplotlib.pyplot as plt
n = 4
cos_all = []
for i in range(10000):
vec_1 = 2 * np.random.rand(n) - 1
if sum(vec_1 ** 2) <= 1:
cos_tmp = vec_1[0] / np.sqrt(sum(vec_1 ** 2))
cos_all.append(cos_tmp)
print(len(cos_all))
plt.hist(cos_all)
plt.show() |
继续推导, 发现,
研究
而, 如此证明了 目标分布确实是一个均匀分布 |
证明是完事了,但还有问题:
|
@guofei9987 正方体的我还要求解一下。PS:GH对latex太不友好了。 import numpy as np
N = int(50E4)
### 正方体
x = np.random.random(size=(N,3)) -0.5
y = np.random.random(size=(N,3)) -0.5
### 球体
# x = np.random.normal(size=(N,3))
# y = np.random.normal(size=(N,3))
def l2__norm(x,axis=1):
return np.sqrt(np.sum(x**2,axis=axis,keepdims=True))
cosine = np.sum(x*y,axis=1,keepdims=1) / l2__norm(x) / l2__norm(y)
import matplotlib.pyplot as plt
plt.hist(cosine,bins=40);
plt.title("N={N}".format(**locals())) |
@shouldsee 感谢,之前用的默认bins做随机模拟,没能看出来cos值的变化, from scipy import stats
n_dim=3
rv=stats.t(n_dim-1).rvs(1000000)
a=np.sqrt(1/(1+(n_dim-1)/(t_rvs**2)))
plt.hist(a,bins=40)
plt.show() ps,怎么插图呀 |
你的公式建议用CodeCog渲染一下不然我实在没法读。 插图用的是 Ctrl+C -> 选定GH输入框 -> Ctrl+V -> 等待上传完成。 import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
n_dim=3
t_rvs=stats.t(n_dim-1).rvs(1000000)
a=np.sqrt(1/(1+(n_dim-1)/(t_rvs**2)))
plt.hist(a,bins=40)
plt.title("$a=\sqrt{1/(1+2/t^2)}$")
plt.show() |
整理了一下 |
随机曲面那个本子是很久以前的了,但是采样的想法也就只是从多维高斯分布采样然后用L2度量正规化投射到球面。本子更多地在讨论球面上的非均匀分布的采样以及写一些可视化。你有兴趣的话我可以抽空新开一本写,但是我最后直接用了vmf分布做超球面上的建模。 我没有看懂最后一步那里求导的过程,希望能够给一电对定积分求导的教程。 总的来说这种硬算读起来还是有一种诡异的暴力美感....而t分布和chi分布中的gamma函数本身可能也来自于超球面的几何。毕竟超球可以看作高维空间的体积源所以还是能体现一些本质问题的。有时间不妨把n=N时余弦的现实表达写出来做个比较。 |
定积分求导那个是定理,用定积分的定义也不难证明。 随机曲面哪个,有空就写写呗,感觉挺有趣的 |
我查了一下你给的那个是Lebniz定理 https://en.wikipedia.org/wiki/Leibniz_integral_rule |
@shouldsee 针对一般曲面,我已经想出一个数学上可行,但编程上不太可取的方案。这周末可以整理完。 |
https://github.com/MathAndAlgo/DiscussionBoard/blob/master/%E9%9A%8F%E6%9C%BA%E5%90%91%E9%87%8F%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98.docx
The text was updated successfully, but these errors were encountered: