zoukankan      html  css  js  c++  java
  • Boltzmann机神经网络python实现

    (python 3)

      1 import numpy 
      2 from scipy import sparse as S
      3 from matplotlib import pyplot as plt 
      4 from scipy.sparse.csr import csr_matrix 
      5 import pandas 
      6 
      7 def normalize(x):
      8     V = x.copy()
      9     V -= x.min(axis=1).reshape(x.shape[0],1)
     10     V /= V.max(axis=1).reshape(x.shape[0],1)
     11     return V
     12     
     13 def sigmoid(x):
     14     #return x*(x > 0)
     15     #return numpy.tanh(x)
     16     return 1.0/(1+numpy.exp(-x)) 
     17 
     18 class RBM():
     19     def __init__(self, n_visible=None, n_hidden=None, W=None, learning_rate = 0.1, weight_decay=1,cd_steps=1,momentum=0.5):
     20         if W == None:
     21             self.W =  numpy.random.uniform(-.1,0.1,(n_visible,  n_hidden)) / numpy.sqrt(n_visible + n_hidden)
     22             self.W = numpy.insert(self.W, 0, 0, axis = 1)
     23             self.W = numpy.insert(self.W, 0, 0, axis = 0)
     24         else:
     25             self.W=W 
     26         self.learning_rate = learning_rate 
     27         self.momentum = momentum
     28         self.last_change = 0
     29         self.last_update = 0
     30         self.cd_steps = cd_steps
     31         self.epoch = 0 
     32         self.weight_decay = weight_decay  
     33         self.Errors = []
     34          
     35             
     36     def fit(self, Input, max_epochs = 1, batch_size=100):  
     37         if isinstance(Input, S.csr_matrix):
     38             bias = S.csr_matrix(numpy.ones((Input.shape[0], 1))) 
     39             csr = S.hstack([bias, Input]).tocsr()
     40         else:
     41             csr = numpy.insert(Input, 0, 1, 1)
     42         for epoch in range(max_epochs): 
     43             idx = numpy.arange(csr.shape[0])
     44             numpy.random.shuffle(idx)
     45             idx = idx[:batch_size]  
     46                    
     47             self.V_state = csr[idx] 
     48             self.H_state = self.activate(self.V_state)
     49             pos_associations = self.V_state.T.dot(self.H_state) 
     50   
     51             for i in range(self.cd_steps):
     52               self.V_state = self.sample(self.H_state)  
     53               self.H_state = self.activate(self.V_state)
     54               
     55             neg_associations = self.V_state.T.dot(self.H_state) 
     56             self.V_state = self.sample(self.H_state) 
     57             
     58             # Update weights. 
     59             w_update = self.learning_rate * ((pos_associations - neg_associations) / batch_size) 
     60             total_change = numpy.sum(numpy.abs(w_update)) 
     61             self.W += self.momentum * self.last_change  + w_update
     62             self.W *= self.weight_decay 
     63             
     64             self.last_change = w_update
     65             
     66             RMSE = numpy.mean((csr[idx] - self.V_state)**2)**0.5
     67             self.Errors.append(RMSE)
     68             self.epoch += 1
     69             print("Epoch %s: RMSE = %s; ||W||: %6.1f; Sum Update: %f" % (self.epoch, RMSE, numpy.sum(numpy.abs(self.W)), total_change))  
     70         return self 
     71         
     72     def learning_curve(self):
     73         plt.ion()
     74         #plt.figure()
     75         plt.show()
     76         E = numpy.array(self.Errors)
     77         plt.plot(pandas.rolling_mean(E, 50)[50:])  
     78      
     79     def activate(self, X):
     80         if X.shape[1] != self.W.shape[0]:
     81             if isinstance(X, S.csr_matrix):
     82                 bias = S.csr_matrix(numpy.ones((X.shape[0], 1))) 
     83                 csr = S.hstack([bias, X]).tocsr()
     84             else:
     85                 csr = numpy.insert(X, 0, 1, 1) 
     86         else:
     87             csr = X
     88         p = sigmoid(csr.dot(self.W)) 
     89         p[:,0]  = 1.0 
     90         return p  
     91         
     92     def sample(self, H, addBias=True): 
     93         if H.shape[1] == self.W.shape[0]:
     94             if isinstance(H, S.csr_matrix):
     95                 bias = S.csr_matrix(numpy.ones((H.shape[0], 1))) 
     96                 csr = S.hstack([bias, H]).tocsr()
     97             else:
     98                 csr = numpy.insert(H, 0, 1, 1)
     99         else:
    100             csr = H
    101         p = sigmoid(csr.dot(self.W.T)) 
    102         p[:,0] = 1
    103         return p
    104       
    105 if __name__=="__main__":
    106     data = numpy.random.uniform(0,1,(100,10))
    107     rbm = RBM(10,15)
    108     rbm.fit(data,1000)
    109     rbm.learning_curve()
  • 相关阅读:
    redis 源码阅读 数值转字符 longlong2str
    redis 源码阅读 内部数据结构--字符串
    redis 查看的版本
    redis 配置
    redis 基础
    redis 安装
    git 中关于LF 和 CRLF 的问题
    git 常用命令
    linux svn 服务端搭建
    测试开发之Django——No8.Django中的视图与URL配置
  • 原文地址:https://www.cnblogs.com/hhh5460/p/4319652.html
Copyright © 2011-2022 走看看