This commit is contained in:
2025-11-21 16:48:18 +01:00
parent f38a6bf034
commit 68e1b12ccf
18 changed files with 74441 additions and 0 deletions

98
P4/P4_1.py Normal file
View File

@@ -0,0 +1,98 @@
import numpy as np
class Perceptron():
def __init__(self):
# Initialize weights randomly between -1 and 1 for 3 inputs
np.random.seed(1) # For reproducible results
self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
def sigmoid(self, x):
"""Sigmoid activation function"""
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
"""Derivative of sigmoid function"""
return x * (1 - x)
def think(self, inputs):
"""One thought step of the perceptron for given inputs"""
# Calculate weighted sum and apply sigmoid function
return self.sigmoid(np.dot(inputs, self.synaptic_weights))
def train(self, inputs, targets, iterations):
"""Training loop with backpropagation and weight adjustments"""
for iteration in range(iterations):
# Forward propagation
output = self.think(inputs)
# Calculate error
error = targets - output
# Backpropagation: calculate weight adjustments
# ΔW = (Error * sigmoid_derivative(output)) × inputs^T
adjustments = np.dot(inputs.T, error * self.sigmoid_derivative(output))
# Update weights
self.synaptic_weights += adjustments
if __name__ == "__main__":
# Create perceptron instance
p = Perceptron()
# Training data from the task
training_inputs = np.array([[0, 0, 1],
[1, 1, 1],
[1, 0, 0],
[0, 1, 1]])
training_targets = np.array([[0, 1, 1, 0]]).T
print("Random synaptic weights before training:")
print(p.synaptic_weights.T)
# Train the perceptron
print("\nTraining the perceptron...")
p.train(training_inputs, training_targets, 10000)
print("\nSynaptic weights after training:")
print(p.synaptic_weights.T)
# Test the perceptron with training data
print("\nTesting with training data:")
for i, inp in enumerate(training_inputs):
output = p.think(inp.reshape(1, -1))
print(f"Input: {inp} → Output: {output[0][0]:.4f} (Target: {training_targets[i][0]})")
# Test with new data [1, 1, 0]
print("\nTesting with new input [1, 1, 0]:")
new_input = np.array([1, 1, 0])
prediction = p.think(new_input.reshape(1, -1))
print(f"Input: {new_input} → Prediction: {prediction[0][0]:.4f}")
# Interactive part - ask user for input
print("\n" + "="*50)
print("Interactive mode:")
while True:
try:
print("\nEnter values for I1, I2, I3 (or 'quit' to exit):")
user_input = input("I1, I2, I3: ")
if user_input.lower() == 'quit':
break
# Parse user input
values = [float(x.strip()) for x in user_input.split(',')]
if len(values) != 3:
print("Please enter exactly 3 values separated by commas.")
continue
user_array = np.array(values)
result = p.think(user_array.reshape(1, -1))
print(f"Perceptron's belief for {user_array}: {result[0][0]:.4f}")
except (ValueError, IndexError):
print("Invalid input. Please enter 3 numbers separated by commas.")
except KeyboardInterrupt:
print("\nExiting...")
break