import numpy as np
import pickle
class SimpleNeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
# Initialize weights
self.W1 = np.random.randn(input_size, hidden_size) * 0.01
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size) * 0.01
self.b2 = np.zeros((1, output_size))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return x * (1 - x)
def train(self, X, y, learning_rate=0.1, epochs=1000):
"""Train the neural network"""
for epoch in range(epochs):
# Forward pass
hidden = self.sigmoid(X.dot(self.W1) + self.b1)
output = self.sigmoid(hidden.dot(self.W2) + self.b2)
# Backward pass
output_error = y - output
output_delta = output_error * self.sigmoid_derivative(output)
hidden_error = output_delta.dot(self.W2.T)
hidden_delta = hidden_error * self.sigmoid_derivative(hidden)
# Update weights
self.W2 += hidden.T.dot(output_delta) * learning_rate
self.b2 += np.sum(output_delta, axis=0, keepdims=True) * learning_rate
self.W1 += X.T.dot(hidden_delta) * learning_rate
self.b1 += np.sum(hidden_delta, axis=0, keepdims=True) * learning_rate
def predict(self, X):
"""Make predictions"""
hidden = self.sigmoid(X.dot(self.W1) + self.b1)
output = self.sigmoid(hidden.dot(self.W2) + self.b2)
return output
def save(self, filepath):
"""Save model"""
with open(filepath, 'wb') as f:
pickle.dump({
'W1': self.W1, 'b1': self.b1,
'W2': self.W2, 'b2': self.b2
}, f)
def load(self, filepath):
"""Load model"""
with open(filepath, 'rb') as f:
data = pickle.load(f)
self.W1 = data['W1']
self.b1 = data['b1']
self.W2 = data['W2']
self.b2 = data['b2']
def create_model():
return SimpleNeuralNetwork(input_size=4, hidden_size=10, output_size=1)