RBF Networks Data Trend Model
Sinopsis
Pembahasan mengenai Data yang mengandung sebuah model Trend/Siklus/Musiman telah banyak dikembangkan dengan metode statistik, Nah kalian akan belajar Pemodelan Data Trend menggunakan Radial Basis Function/RBF net dapat digunakan untuk aproksimasi sebuah model forecasting yang mempresentasikan sebuah data yang mengandung pola trend. RBF menggunakan distribusi gaussian sebagai basis function nya. Sebelum melangkah lebih jauh mengenai RBF, maka perlu sedikit membahas distribusi gaussian. Penulis menggunakan bahasa Python dan Matplotlib, kalian bisa pelajari bahasa tersebut disini.
DISTRIBUSI GAUSSIAN
σ disebut standar deviasi
σ2 disebut variance
BACKPROPAGASI DI RBF NET
bi adalah bias
ki adalah jumlah cluster
ҩj adalah radial basis function dari Gaussian dengan detail sebagai berikut
def rbf(x, c, s): ''' c adalah mean yang berasal dari centroid kmeans s adalah standar deviasi masing-masing anggota kmeans ''' return np.exp(-1 / (2 * s**2) * (x-c)**2)
Khusus untuk Kmeans, kita gunakan pustaka Sklearn saja, dengan sedikit modifikasi yaitu dengan menambahkan sedikit code untuk menghitung standar deviasi untuk masing-masing anggota kelas.
def kmeans2(X,k): ''' ref: https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html ''' p = np.reshape(X,[len(X),1]) k_means = KMeans(n_clusters=k,init='random',n_init=30) k_means.fit(p) stds = list() for i in range(0,k): stds.append(np.std(y[k_means.labels_==i])) #hitung std stds = np.array(stds) center = k_means.cluster_centers_ center = np.reshape(center,[len(center)]) #ubah dimensi return center, stds
Class RBF untuk neural networknya
class RBFNet(object): """Implementation of a Radial Basis Function Network""" def __init__(self, k=2, lr=0.01, epochs=100, rbf=rbf): self.k = k self.lr = lr self.epochs = epochs self.rbf = rbf self.w = np.random.randn(k) self.b = np.random.randn(1) def fit(self, X, y): # compute stds from data self.centers, self.stds = kmeans2(X, self.k) # training for epoch in range(self.epochs): for i in range(X.shape[0]): # forward pass a = np.array([self.rbf(X[i], c, s) for c, s, in zip(self.centers, self.stds)]) F = a.T.dot(self.w) + self.b loss = (y[i] - F).flatten() ** 2 print('Loss: {0:.2f}'.format(loss[0])) # backward pass error = -(y[i] - F).flatten() # online update self.w = self.w - self.lr * a * error self.b = self.b - self.lr * error def predict(self, X): y_pred = [] for i in range(X.shape[0]): a = np.array([self.rbf(X[i], c, s) for c, s, in zip(self.centers, self.stds)]) F = a.T.dot(self.w) + self.b y_pred.append(F) return np.array(y_pred)