1

我正在尝试将sklearn.neural_network.BernoulliRBM与 iris 数据集一起使用:

from sklearn import datasets
iris = datasets.load_iris() 
collist = ['SL', 'SW', 'PL', 'PW']
dat = pd.DataFrame(data=iris.data, columns=collist)

from sklearn.neural_network import BernoulliRBM
model = BernoulliRBM(n_components=2)
scores = model.fit_transform(dat)
print(scores.shape)
print(scores)

但是,我只得到 1 作为所有行的输出:

(150, 2)
[[1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]  # same for all rows

我可以像在主成分分析中获得的那样获得类似于单个行的分数的值吗?否则我怎样才能从 RBM 获得一些有用的数字?我试过model.score_samples(dat)了,但这也0为绝大多数行提供了价值。

4

1 回答 1

1

根据文档

该模型对输入的分布做出假设。目前,scikit-learn 仅提供 BernoulliRBM,它假设输入是二进制值或 0 到 1 之间的值,每个都编码特定功能将被打开的概率。

由于您的dat值都大于 1,我猜该模型会将所有输入数据截断为 1.0。例如,如果您应用规范化:

from sklearn.preprocessing import normalize
scores = model.fit_transform(normalize(dat))

你会得到一些变化的值:

array([[0.23041219, 0.23019722],
   [0.23046652, 0.23025144],
   ...,
   [0.23159369, 0.23137678],
   [0.2316786 , 0.23146158]])

由于您的输入特征必须具有概率解释,因此您需要考虑是否对您正在解决的特定问题进行任何归一化是合理的。

于 2018-04-08T18:17:06.857 回答