-
-
Notifications
You must be signed in to change notification settings - Fork 46.8k
Create radial_basis_function_neural_network #12342
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
b8a4a9f
923dcae
fa6233a
2a8b201
a3bf625
c2a5cd0
f6028cc
6d8e719
4b5fa39
3d4150a
a65dcc2
b52bc75
8196fd2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
""" | ||
- - - - - -- - - - - - - - - - - - - - - - - - - - - - - | ||
Name - - ART1 - Adaptive Resonance Theory 1 | ||
Goal - - Cluster Binary Data | ||
Detail: Unsupervised clustering model using a vigilance parameter | ||
to control cluster formation in binary datasets. | ||
* Initialize with features and vigilance threshold | ||
* Train to form clusters based on input patterns | ||
* Predict for assigning new inputs to clusters | ||
Author: Your Name | ||
Github: [email protected] | ||
Date: 2024.10.31 | ||
- - - - - -- - - - - - - - - - - - - - - - - - - - - - - | ||
""" | ||
|
||
import numpy as np | ||
|
||
|
||
class ART1: | ||
def __init__(self, num_features, vigilance=0.8): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Initialize the ART1 model with the number of features and the vigilance parameter. | ||
|
||
Parameters: | ||
num_features (int): Number of features in input binary data. | ||
vigilance (float): Vigilance parameter to control cluster formation (0 < vigilance <= 1). | ||
""" | ||
self.num_features = num_features | ||
self.vigilance = vigilance | ||
self.weights = [] # Stores the weights for clusters | ||
|
||
def _similarity(self, x, w): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide descriptive name for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Calculate similarity between input vector x and weight vector w. | ||
|
||
Parameters: | ||
x (np.array): Input binary vector. | ||
w (np.array): Cluster weight vector. | ||
|
||
Returns: | ||
float: Similarity value based on the intersection over the input length. | ||
""" | ||
return np.sum(np.minimum(x, w)) / np.sum(x) | ||
|
||
def _weight_update(self, x, w): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide descriptive name for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Update weights for a cluster based on input vector. | ||
|
||
Parameters: | ||
x (np.array): Input binary vector. | ||
w (np.array): Cluster weight vector. | ||
|
||
Returns: | ||
np.array: Updated weight vector. | ||
""" | ||
return np.minimum(x, w) | ||
|
||
def train(self, data): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: |
||
""" | ||
Train the ART1 model to form clusters based on the vigilance parameter. | ||
|
||
Parameters: | ||
data (np.array): Binary dataset with each row as a sample. | ||
""" | ||
for x in data: | ||
assigned = False | ||
for i, w in enumerate(self.weights): | ||
# Check similarity and update weights if similarity exceeds vigilance | ||
similarity = self._similarity(x, w) | ||
if similarity >= self.vigilance: | ||
self.weights[i] = self._weight_update(x, w) | ||
assigned = True | ||
break | ||
if not assigned: | ||
self.weights.append(x.copy()) | ||
|
||
def predict(self, x): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Predict the cluster for a new input vector or classify it as a new cluster. | ||
|
||
Parameters: | ||
x (np.array): Input binary vector. | ||
|
||
Returns: | ||
int: Cluster index for the input or -1 if classified as a new cluster. | ||
""" | ||
for i, w in enumerate(self.weights): | ||
# Check similarity for prediction | ||
similarity = self._similarity(x, w) | ||
if similarity >= self.vigilance: | ||
return i | ||
return -1 | ||
|
||
def get_weights(self): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: |
||
""" | ||
Retrieve the weight vectors of the clusters. | ||
|
||
Returns: | ||
list: List of weight vectors for each cluster. | ||
""" | ||
return self.weights |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
""" | ||
- - - - - -- - - - - - - - - - - - - - - - - - - - - - - | ||
Name - - RBFNN - Radial Basis Function Neural Network | ||
Goal - - Recognize Patterns in Data | ||
Detail: Total 3 layers neural network | ||
* Input layer | ||
* Hidden layer with RBF activation | ||
* Output layer | ||
Author: Your Name | ||
Github: [email protected] | ||
Date: 2024.10.31 | ||
- - - - - -- - - - - - - - - - - - - - - - - - - - - - - | ||
""" | ||
|
||
import numpy as np # For numerical operations | ||
|
||
|
||
class RBFNN: | ||
def __init__(self, input_size, hidden_size, output_size): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Initialize the RBFNN parameters. | ||
|
||
:param input_size: Number of input features | ||
:param hidden_size: Number of hidden units in the RBF layer | ||
:param output_size: Number of output classes | ||
""" | ||
self.input_size = input_size # Size of input layer | ||
self.hidden_size = hidden_size # Size of hidden layer | ||
self.output_size = output_size # Size of output layer | ||
|
||
rng = np.random.default_rng() # Create a random number generator | ||
# Initialize centers and spread of the RBF neurons | ||
self.centers = rng.random((hidden_size, input_size)) # Centers for RBF | ||
self.spread = rng.random(hidden_size) # Spread for each RBF | ||
|
||
# Initialize weights for the output layer | ||
self.weights = rng.random( | ||
(hidden_size, output_size) | ||
) # Weights for output layer | ||
|
||
def rbf(self, x, center, spread): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: |
||
"""Radial Basis Function (Gaussian).""" | ||
return np.exp(-(np.linalg.norm(x - center) ** 2) / (2 * spread**2)) | ||
|
||
def forward(self, x): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide descriptive name for the parameter: Please provide type hint for the parameter: |
||
"""Forward pass through the network.""" | ||
hidden_outputs = np.zeros(self.hidden_size) # Outputs of hidden layer | ||
for i in range(self.hidden_size): | ||
hidden_outputs[i] = self.rbf( | ||
x, self.centers[i], self.spread[i] | ||
) # Compute RBF outputs | ||
|
||
output = np.dot(hidden_outputs, self.weights) # Compute final output | ||
return output | ||
|
||
def train(self, x_train, y_train, epochs, learning_rate): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: Please provide type hint for the parameter: |
||
""" | ||
Train the RBFNN model. | ||
|
||
:param x_train: Input data | ||
:param y_train: Target output | ||
:param epochs: Number of training iterations | ||
:param learning_rate: Learning rate for weight updates | ||
""" | ||
for _ in range(epochs): # Use underscore for unused loop variable | ||
for i in range(len(x_train)): | ||
x_i = x_train[i] | ||
y_i = y_train[i] | ||
|
||
# Forward pass | ||
hidden_outputs = np.zeros(self.hidden_size) | ||
for j in range(self.hidden_size): | ||
hidden_outputs[j] = self.rbf(x_i, self.centers[j], self.spread[j]) | ||
|
||
output = np.dot(hidden_outputs, self.weights) # Output layer | ||
|
||
# Calculate the error | ||
error = y_i - output | ||
|
||
# Update weights | ||
self.weights += learning_rate * hidden_outputs.reshape(-1, 1) * error | ||
|
||
def predict(self, x_test): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As there is no test file in this pull request nor any test function or class in the file Please provide return type hint for the function: Please provide type hint for the parameter: |
||
""" | ||
Predict outputs for given input data. | ||
|
||
:param x_test: Input data | ||
:return: Predicted outputs | ||
""" | ||
predictions = [] | ||
for x in x_test: | ||
output = self.forward(x) # Forward pass to get prediction | ||
predictions.append(output) | ||
return np.array(predictions) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please provide return type hint for the function:
__init__
. If the function does not return a value, please provide the type hint as:def function() -> None:
Please provide type hint for the parameter:
num_features
Please provide type hint for the parameter:
vigilance