如何在两个独立的XOR门上执行降维?

时间:2015-05-26 13:15:00

标签: python machine-learning scikit-learn

获取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,每个都由一些更细粒度的东西组成。如果我说错了,请随意指出。

0 个答案:

没有答案