获取XOR门的概率分布,其中每个配置都是同等可能的(配置由outcomes_sub
给出;概率质量函数由pmf_xor_sub
):
import numpy as np
import itertools as it
outcomes_sub = [list(item) for item in list(it.product([0,1], repeat=3))]
pmf_xor_sub = np.array([1/4, 0, 0, 1/4, 0, 1/4, 1/4, 0])
现在采用对应于两个不相关的此类XOR的概率分布:
outcomes = [outcome1 + outcome2 for (outcome1, outcome2)
in it.product(outcomes_sub, outcomes_sub)]
pmf_xor = [pmf1 * pmf2 for (pmf1, pmf2)
in it.product(pmf_xor_sub, pmf_xor_sub)]
并根据它创建一些数据:
indices = np.random.choice(len(outcomes), 10000, p=pmf_xor)
data_xor = np.array([outcomes[index] for index in indices])
data_xor
看起来像这样:
array([[1, 1, 0, 0, 0, 0],
[1, 0, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 0],
...,
[0, 1, 1, 1, 1, 0],
[1, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0]])
即,两个独立的XOR背靠背。什么是对其进行降维的正确方法? PCA不起作用(因为依赖是非线性的,对吗?):
from sklearn import decomposition
pca_xor = decomposition.PCA()
pca_xor.fit(data_xor)
现在,pca_xor.explained_variance_ratio_
给出了:
array([ 0.17145045, 0.17018817, 0.16758773, 0.16575979, 0.16410862,
0.16090524], dtype=float32)
没有两个组成部分脱颖而出。我知道像PCA这样的非线性方法应该可以在这里工作,但我很难找到将它应用到我的问题的方法。
为了给出更多的上下文:我实际上是在data_xor
中提出结构的方法:两个大的XOR blob,每个都由一些更细粒度的东西组成。如果我说错了,请随意指出。