import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy.linalg import norm , pinv
class RBF:
def __init__(self,input_dim=1,num_centers=2,out_dim=1):
self.input_dim = input_dim
self.num_centers = num_centers
self.out_dim = out_dim
self.beta = 8
self.centers = [np.random.uniform(-1,1,input_dim) for i in range(num_centers)]
self.W = np.random.random((self.num_centers,self.out_dim))
def _basisfunc(self,c,d):
return np.exp(-self.beta * norm(c-d)**2)
def _calcAct(self,X):
G = np.zeros((X.shape[0],self.num_centers),dtype = np.float)
for ci , c in enumerate(self.centers):
for xi , x in enumerate(X):
G[xi , ci] = self._basisfunc(c,x)
return G
def train(self,X,Y):
rnd_idx = np.random.permutation(X.shape[0])[:self.num_centers]
self.centers = [X[i] for i in rnd_idx]
G = self._calcAct(X)
self.W = np.dot(pinv(G),Y)
def predict(self,X):
G = self._calcAct(X)
Y = np.dot(G,self.W)
return Y
pass
if __name__ == "__main__":
x = np.arange(-1,1.1,0.1).reshape(-1,1)
y = np.array([-.09602,-0.5770,-0.0729,0.3771,0.6405,0.6600,0.4609,0.1336,-0.2013,-0.4344,-0.5,-0.3930,-0.1647,0.0988,0.3072,0.3960,0.3449,0.1816,-0.0312,-0.2189,-0.3201])
y_pred = np.random.rand(21)
net = RBF(1,15,1)
net.train(X=x,Y=y)
y_pred = net.predict(x)
plt.title("Radial Basis Transfer Function")
plt.plot(x,y,color="green",label="f(x)")
plt.plot(x,y_pred,color="blue",label = 'fitted f(x)')
plt.legend()
plt.xlabel("x axis")
plt.ylabel("y axis")
plt.savefig("RBF.jpg")