2017-05-11 5 views
2

J'essaye de mettre en application une machine de boltzmann restreinte en C++. J'utilise ce code Python comme guide: https://github.com/echen/restricted-boltzmann-machines/blob/master/rbm.pyQu'est-ce que le symbole supérieur signifie dans ce morceau de code python?

Ceci est la ligne 37:

pos_hidden_states = pos_hidden_probs > np.random.rand(num_examples, self.num_hidden + 1) 

pos_hidden_states et pos_hidden_probs sont les deux matrices 2D, de type vector<vector<double>> en C++ et num_examples et num_hidden sont les deux entiers. Est-ce que quelqu'un pourrait expliquer ce que le symbole supérieur signifie ici?

+1

se réfèrent ici https: //docs.scipy .org/doc/numpy/reference/généré/numpy.greater.html # numpy.greater – JkShaw

+0

http://stackoverflow.com/questions/1061283/lt-instead-of-cmp & https://docs.python.org /3/reference/datamodel.html#object.__lt__ –

Répondre

7

Probablement pas facile de traduire numpy en C++, beaucoup d'abstraction en numpy. Quoi qu'il en soit, il est agissant à titre de comparaison vectorisée, parce que np.random.rand(...) retourne un np.ndarray qui, si elle pos_hidden_probs est soit un scalaire ou un np.ndarray il se comporte d'une manière vectorisée (c.-à-élément par élément):

>>> rand_array = np.random.rand(2, 2) 
>>> rand_array 
array([[ 0.1807726 , 0.67617382], 
     [ 0.84396805, 0.04450794]]) 
>>> 0.5 > rand_array 
array([[ True, False], 
     [False, True]], dtype=bool) 
>>> 

Si pos_hidden_probs est une sorte de np.ndarray, le comportement peut être influencé par broadcasting, une caractéristique de numpy:

>>> np.array([0.5, 0.5]) > rand_array 
array([[ True, False], 
     [False, True]], dtype=bool) 
>>> np.array([0.5, .9]) > rand_array 
array([[ True, True], 
     [False, True]], dtype=bool) 
>>> 
1

En raison d'une surcharge de l'opérateur, l'opérateur > peut faire pratiquement n'importe quoi - il appelle simplement la méthode spéciale __gt__ sur l'objet. Mais en l'absence de toute autre information, je m'attendrais à ce qu'il évalue simplement "supérieur à" et renvoie une valeur bool.

3

l'opérateur > fonctionne-élément par élément dans numPy, par exemple

np.array([[1,2],[3,4]]) > np.array([[2,2],[2,2]]) 

vous donne np.array([[False,False],[True,True]])

NumPy fait aussi broadcasting, ce qui donne un sens à la comparaison entre les tableaux de dimensions différentes.

2

Le> est la comparaison du prob caché (un flotteur dans ce cas) contre chaque élément dans un tableau numpy 2d et en retournant un tableau 2D de valeurs booléennes:

>>> import numpy as np 
>>> np.random.randn(3,2)array([[-0.74615339, -1.22667606], 
     [ 0.22729787, 0.72070398], 
     [-1.06876014, 0.06367189]]) 
>>> 5. > np.random.randn(3,2) 
array([[ True, True], 
     [ True, True], 
     [ True, True]], dtype=bool) 
>>>