Загрузка данных
import random
# 1. Эталоны (обучающая выборка)
num4 = list('101101111001001') # 4 обычная
num4_h = list('001001111101101') # 4, отражение по горизонтали
num4_v = list('101101111100100') # 4, отражение по вертикали
etalons = [num4, num4_h, num4_v]
names = [
"4 обычная",
"4 отражение по горизонтали",
"4 отражение по вертикали"
]
# 2. Однослойная ИНС (обучение с учителем)
# 15 входов, 3 выхода (по одному на каждый класс)
weights_1 = [[0 for _ in range(15)] for _ in range(3)]
bias_1 = [7, 7, 7] # пороги функции активации
def net_output_1(inputs, cls):
"""Взвешенная сумма для класса cls (однослойная сеть)"""
s = 0
for i in range(15):
s += int(inputs[i]) * weights_1[cls][i]
return s
def activate_1(s, cls):
"""Пороговая функция активации"""
return 1 if s >= bias_1[cls] else 0
def train_one_layer(epochs=10000):
"""Обучение однослойной ИНС с учителем (правило перцептрона)"""
for _ in range(epochs):
cls = random.randint(0, 2) # случайный класс
inputs = etalons[cls]
for c in range(3):
target = 1 if c == cls else 0
s = net_output_1(inputs, c)
y = activate_1(s, c)
if y != target:
# Коррекция весов
for i in range(15):
if int(inputs[i]) == 1:
if target == 1:
weights_1[c][i] += 1
else:
weights_1[c][i] -= 1
def predict_one_layer(inputs):
"""Предсказание однослойной ИНС (возвращает взвешенные суммы)"""
scores = []
for c in range(3):
s = net_output_1(inputs, c)
scores.append(s)
return scores
# 3. Многослойная ИНС (обучение с учителем)
class NeuralNetwork:
def __init__(self, layers, weights):
self.layers = layers
self.weights = weights
def feed_forward(self, inputs):
current = [int(x) for x in inputs]
self.hidden_output = []
self.final_output = []
# Скрытый слой
for j in range(self.layers[1]):
summ = 0
for i in range(self.layers[0]):
summ += current[i] * self.weights[0][i][j]
self.hidden_output.append(summ)
# Выходной слой
for j in range(self.layers[2]):
summ = 0
for i in range(self.layers[1]):
summ += self.hidden_output[i] * self.weights[1][i][j]
self.final_output.append(summ)
return self.final_output
# Веса скрытого слоя: 15 входов → 3 нейрона
w1 = []
for i in range(15):
w1.append([
1 if num4[i] == '1' else -1,
1 if num4_h[i] == '1' else -1,
1 if num4_v[i] == '1' else -1,
])
# Веса выходного слоя: 3 → 4
# 3 класса + "не 4"
w2 = [
[1, 0, 0, -1],
[0, 1, 0, -1],
[0, 0, 1, -1]
]
net = NeuralNetwork([15, 3, 4], [w1, w2])
# 4. Функция сравнения с эталонами
def similarity(inputs, etalon):
"""Сколько бит совпало"""
matches = 0
for i in range(15):
if int(inputs[i]) == int(etalon[i]):
matches += 1
return matches
# 5. Обучение однослойной ИНС
train_one_layer()
# 6. Основная программа (ввод и решение)
print("Введите 15 символов (0 или 1). Матрица 3x5:")
print(" 4 обычная: 101101111001001")
print(" 4 отражение по гориз.: 001001111101101")
print(" 4 отражение по верт.: 101101111100100")
number = input("Ваш ввод: ").strip()
if len(number) != 15 or any(c not in '01' for c in number):
print("\nОшибка: нужно ровно 15 символов, только 0 или 1!")
else:
inputs = [int(c) for c in number]
# Многослойная ИНС
final_output = net.feed_forward(inputs)
# Однослойная ИНС
scores_1 = predict_one_layer(inputs)
# Сравнение с эталонами
scores = []
for et in etalons:
scores.append(similarity(inputs, et))
# --- Вывод матрицы 3x5 ---
print("\nВведённая матрица 3x5:")
for row in range(3):
line = ""
for col in range(5):
idx = row * 5 + col
line += "█" if inputs[idx] == 1 else "·"
line += " "
print(" " + line)
# Результаты сравнения ---
print("\nСовпадения с эталонами:")
for i in range(3):
print(f" {names[i]}: {scores[i]} из 15")
# --- Решение ---
best = scores.index(max(scores))
best_score = max(scores)
print("\nРезультаты однослойной ИНС (взвешенные суммы):")
for i in range(3):
print(f" {names[i]}: {scores_1[i]}")
print("\nРезультаты многослойной ИНС (выходной слой):")
for i in range(len(final_output)):
print(f" выход {i+1}: {final_output[i]}")
print("\n" + "=" * 60)
if best_score < 13:
print("Решение: это вообще не 4")
else:
print(f"Решение: это {names[best]}")
print("=" * 60)