2016-09-30 5 views
0

Supposons que j'ai une matrice avec des valeurs entières. Je veux rendre la matrice stochastique (c'est-à-dire la somme de chaque ligne dans la matrice égale à 1)Matrice entière à normalisation de matrice stochastique

Je crée une matrice aléatoire, compte la somme de chaque ligne et divise chaque élément en ligne pour la somme des lignes. Après cette somme de chaque ligne doit être égale à 1. Mais ce n'est pas le cas.

dt = pd.DataFrame(np.random.randint(0,10000,size=10000).reshape(100,100)) 
dt['sum_row'] = dt.sum(axis=1) 
for col_n in dt.columns[:-1]: 
    dt[col_n] = dt[col_n]/dt['sum_row'] 

Je comprends que certaines valeurs ne sont pas exactement 1 mais très proches de celles-ci. Néanmoins, comment puis-je normaliser la matrice correctement?

+1

Notez que '== 1' en 3/2 Python 2. Essayez de convertir l'un des deux numéros dans la division un 'float 'en premier:' dt [col_n]/float (dt [' sum_row ']) '. –

Répondre

1

Vous ne pouvez pas garantir que les flotteurs seront exactement un, mais vous pouvez vérifier de près avec une précision arbitraire avec np.around.

Ceci est probablement plus facile/plus rapide sans faire une boucle sur les colonnes pandas.

X = np.random.randint(0,10000,size=10000).reshape(100,100) 
X_float = X.astype(float) 
Y = X_float/X_float.sum(axis=1)[:,np.newaxis] 

sum(np.around(Y.sum(axis=1),decimals=10)==1) # is 100 

(vous n'avez pas besoin l'étape .astype(float) 3.x python)