Advertisement
Guest User

RBFNet

a guest
Aug 11th, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.84 KB | None | 0 0
  1. import pandas as pd
  2. import numpy as np
  3.  
  4. import sklearn.cluster
  5. from sklearn.metrics.pairwise import euclidean_distances
  6.  
  7. import sklearn.metrics
  8. import sklearn.linear_model
  9. from sklearn.base import BaseEstimator, ClassifierMixin
  10.  
  11.  
  12. class RBFNetwork(BaseEstimator, ClassifierMixin):
  13.  
  14.     def __init__(self, number_of_centers, random_state=42):
  15.         self.number_of_centers = number_of_centers
  16.  
  17.         self.random_state = random_state
  18.  
  19.  
  20.     @staticmethod
  21.     def make_gaussian_kernel(center, sigma):
  22.         ''' Creates a Gaussian Kernel function that takes X and calculate the
  23.        distance from the center with the sigma deviation.
  24.        '''
  25.         variance = sigma**2
  26.         if(variance == 0):
  27.              variance = 1e-10
  28.         gamma = 2*(variance)
  29.         reshaped_center = np.reshape(center, newshape=(1, -1))
  30.  
  31.         def gaussian(X):
  32.             dist = euclidean_distances(X, reshaped_center, squared=True)
  33.             normalization_constant = 1/(2*np.pi*variance)
  34.             return normalization_constant * np.exp(-(dist/gamma))
  35.         return gaussian
  36.  
  37.     def fit(self, X, y):
  38.        
  39.        
  40.         self.centers = None
  41.         self.centers_std = None
  42.         self.kernels = None
  43.        
  44.         self.algorithm = sklearn.linear_model.LinearRegression()        
  45.  
  46.         self._fit_centers(X, y)
  47.         self._generate_radial_functions()
  48.  
  49.         transformed_X = self._transformed_inputs(X)
  50.         self._linear_fit(transformed_X, y)
  51.  
  52.     def predict(self, X):
  53.         transformed_X = self._transformed_inputs(X)
  54.         return (self.algorithm.predict(transformed_X))
  55.  
  56.     def _fit_centers(self, X, y=None):
  57.         kmeans = sklearn.cluster.KMeans(n_clusters=self.number_of_centers,
  58.                                         random_state=self.random_state)
  59.         kmeans.fit(X)
  60.         self.centers = kmeans.cluster_centers_
  61.         groups = kmeans.predict(X)
  62.  
  63.         center_distances = euclidean_distances(X, self.centers)
  64.         center_distances_df = pd.DataFrame(center_distances)
  65.         center_distances_df['classe'] = groups
  66.  
  67.         center_distances_std = center_distances_df.groupby('classe').std()
  68.         self.centers_std = np.diag(center_distances_std)
  69.  
  70.     def _generate_radial_functions(self):
  71.         self.kernels = list()
  72.         for cluster_center, cluster_deviance in zip(self.centers, self.centers_std):
  73.             kernel = RBFNetwork.make_gaussian_kernel(
  74.                 cluster_center, cluster_deviance)
  75.             self.kernels.append(kernel)
  76.  
  77.     def _transformed_inputs(self, X):
  78.         features = [kernel(X) for kernel in self.kernels]
  79.         features_array = (np.concatenate(features, axis=1))
  80.         features_array = np.nan_to_num(x = features_array, nan = 0.0 )
  81.         return features_array
  82.  
  83.     def _linear_fit(self, hidden_X, y):
  84.         self.algorithm.fit(hidden_X, y)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement