我正在尝试使用sklearn.neural_network。伯努利RBM与虹膜数据集:
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
值。
根据文档:
该模型对输入的分布做出假设。在 目前,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]])
由于输入要素必须具有概率解释,因此您需要考虑对于要解决的特定问题,如果任何归一化是合理的,该怎么办。