我正在尝试将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
的值。
答案 0 :(得分: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]])
由于您的输入要素必须具有解释为概率,因此您需要考虑如果任何规范化对于您正在解决的特定问题是合理的。