La mia soluzione
import numpy as np
def layer_1_z(x, w1, b1):
return 1 / w1 * x + b1
def layer_2(x, w1, b1, w2, b2):
y1 = layer_1_z(x, w1, b1)
y2 = y1 - np.floor(y1)
return w2 * y2 + b2
def layer_2_activation(x, w1, b1, w2, b2):
y2 = layer_2(x, w1, b1, w2, b2)
# return 1 / (1 + np.exp(-y2))
return (y2 > 0) * 1
def loss(param):
w1, b1, w2, b2 = param
x = np.arange(0, 1000, 1)
y_hat = layer_2_activation(x, w1, b1, w2, b2)
y_true = (x % 2 > 0) * 1
return sum(np.square(y_hat - y_true))
# %%
from sko.GA import GA
ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
for x in range(1001, 1200):
y_hat = layer_2_activation(x, *best_x)
print('input:{},divide by 2:{}'.format(x, y_hat == 0))
input: 1001, divide per 2: input falso: 1002, divide per 2: input vero: 1003, divide per 2: input falso: 1004, divide per 2: input vero: 1005, divide per 2: input falso: 1006, divide per 2: input vero: 1007, divisione per 2: input falso: 1008, divisione per 2: input vero: 1009, divisione per 2: input falso: 1010, divisione per 2: input vero: 1011, divisione per 2: input falso : 1012, divisione per 2: input vero: 1013, divisione per 2: input falso: 1014, divisione per 2: input vero: 1015, divisione per 2: input falso: 1016, divisione per 2: input vero: 1017, divisione per 2: input falso: 1018, divisione per 2: input vero: 1019, divisione per 2: input falso: 1020, divisione per 2: input vero: 1021, divisione per 2: input falso: 1022, divisione per 2: input vero: 1023, divisione per 2: input falso: 1024, divisione per 2: input vero: 1025, divisione per 2: input falso: 1026, divisione per 2: input vero: 1027, divisione per 2: input falso: 1028, divisione per 2 : True input: 1029, dividi per 2:Ingresso falso: 1030, divisione per 2: input vero: 1031, divisione per 2: input falso: 1032, divisione per 2: input vero: 1033, divisione per 2: input falso: 1034, divisione per 2: input vero: 1035, divide per 2: input falso: 1036, divide per 2: input vero: 1037, divide per 2: input falso: 1038, divide per 2: input vero: 1039, divide per 2: input falso: 1040, divide per 2: true input: 1041, divisione per 2: input falso: 1042, divisione per 2: input vero: 1043, divisione per 2: input falso: 1044, divisione per 2: input vero: 1045, divisione per 2: input falso: 1046, divisione per 2: input vero: 1047, divisione per 2: input falso: 1048, divisione per 2: input vero: 1049, divisione per 2: input falso: 1050, divisione per 2: input vero: 1051, divisione per 2: input falso : 1052, divisione per 2: input vero: 1053, divisione per 2: input falso: 1054, divisione per 2: input vero: 1055, divisione per 2: input falso: 1056, divisione per 2: input vero: 1057, divisione per 2: input falso: 1058, divisione per 2:Input vero: 1059, divisione per 2: input falso: 1060, divisione per 2: input vero: 1061, divisione per 2: input falso: 1062, divisione per 2: input vero: 1063, divisione per 2: input falso: 1064, divide per 2: input vero: 1065, divide per 2: input falso: 1066, divide per 2: input vero: 1067, divide per 2: input falso: 1068, divide per 2: input vero: 1069, divide per 2: falso input: 1070, divisione per 2: input vero: 1071, divisione per 2: input falso: 1072, divisione per 2: input vero: 1073, divisione per 2: input falso: 1074, divisione per 2: input vero: 1075, divisione per 2: input falso: 1076, divisione per 2: input vero: 1077, divisione per 2: input falso: 1078, divisione per 2: input vero: 1079, divisione per 2: input falso: 1080, divisione per 2: input vero : 1081, divisione per 2: input falso: 1082, divisione per 2: input vero: 1083, divisione per 2: input falso: 1084, divisione per 2: input vero: 1085, divisione per 2: input falso: 1086, divisione per 2: input vero: 1087, dividere per 2:Ingresso falso: 1088, divisione per 2: input vero: 1089, divisione per 2: input falso: 1090, divisione per 2: input vero: 1091, divisione per 2: input falso: 1092, divisione per 2: input vero: 1093, divide per 2: input falso: 1094, divide per 2: input vero: 1095, divide per 2: input falso: 1096, divide per 2: input vero: 1097, divide per 2: input falso: 1098, divide per 2: true input: 1099, divisione per 2: input falso: 1100, divisione per 2: input vero: 1101, divisione per 2: input falso: 1102, divisione per 2: input vero: 1103, divisione per 2: input falso: 1104, divisione per 2: input vero: 1105, divisione per 2: input falso: 1106, divisione per 2: input vero: 1107, divisione per 2: input falso: 1108, divisione per 2: input vero: 1109, divisione per 2: input falso : 1110, divisione per 2: input vero: 1111, divisione per 2: input falso: 1112, divisione per 2: input vero: 1113, divisione per 2: input falso: 1114, divisione per 2: input vero: 1115, divisione per 2: input falso: 1116, divisione per 2:Input vero: 1117, divisione per 2: input falso: 1118, divisione per 2: input vero: 1119, divisione per 2: input falso: 1120, divisione per 2: input vero: 1121, divisione per 2: input falso: 1122, divide per 2: input vero: 1123, divide per 2: input falso: 1124, divide per 2: input vero: 1125, divide per 2: input falso: 1126, divide per 2: input vero: 1127, divide per 2: falso input: 1128, divisione per 2: input vero: 1129, divisione per 2: input falso: 1130, divisione per 2: input vero: 1131, divisione per 2: input falso: 1132, divisione per 2: input vero: 1133, divisione per 2: input falso: 1134, divisione per 2: input vero: 1135, divisione per 2: input falso: 1136, divisione per 2: input vero: 1137, divisione per 2: input falso: 1138, divisione per 2: input vero : 1139, divisione per 2: input falso: 1140, divisione per 2: input vero: 1141, divisione per 2: input falso: 1142, divisione per 2: input vero: 1143, divisione per 2: input falso: 1144, divisione per 2: input vero: 1145, dividere per 2:Ingresso falso: 1146, divisione per 2: input vero: 1147, divisione per 2: input falso: 1148, divisione per 2: input vero: 1149, divisione per 2: input falso: 1150, divisione per 2: input vero: 1151, divide per 2: input falso: 1152, divide per 2: input vero: 1153, divide per 2: input falso: 1154, divide per 2: input vero: 1155, divide per 2: input falso: 1156, divide per 2: true input: 1157, divisione per 2: input falso: 1158, divisione per 2: input vero: 1159, divisione per 2: input falso: 1160, divisione per 2: input vero: 1161, divisione per 2: input falso: 1162, divisione per 2: input vero: 1163, divisione per 2: input falso: 1164, divisione per 2: input vero: 1165, divisione per 2: input falso: 1166, divisione per 2: input vero: 1167, divisione per 2: input falso : 1168, divisione per 2: input vero: 1169, divisione per 2: input falso: 1170, divisione per 2: input vero: 1171, divisione per 2: input falso: 1172, divisione per 2: input vero: 1173, divisione per 2: input falso: 1174, divisione per 2:Input vero: 1175, divisione per 2: input falso: 1176, divisione per 2: input vero: 1177, divisione per 2: input falso: 1178, divisione per 2: input vero: 1179, divisione per 2: input falso: 1180, divide per 2: input vero: 1181, divide per 2: input falso: 1182, divide per 2: input vero: 1183, divide per 2: input falso: 1184, divide per 2: input vero: 1185, divide per 2: falso input: 1186, divisione per 2: input vero: 1187, divisione per 2: input falso: 1188, divisione per 2: input vero: 1189, divisione per 2: input falso: 1190, divisione per 2: input vero: 1191, divisione per 2: input falso: 1192, divisione per 2: input vero: 1193, divisione per 2: input falso: 1194, divisione per 2: input vero: 1195, divisione per 2: input falso: 1196, divisione per 2: input vero : 1197, divisione per 2: input falso: 1198, divisione per 2: input vero: 1199, divisione per 2: falseInput vero: 1179, divisione per 2: input falso: 1180, divisione per 2: input vero: 1181, divisione per 2: input falso: 1182, divisione per 2: input vero: 1183, divisione per 2: input falso: 1184, divide per 2: input vero: 1185, divide per 2: input falso: 1186, divide per 2: input vero: 1187, divide per 2: input falso: 1188, divide per 2: input vero: 1189, divide per 2: falso input: 1190, divisione per 2: input vero: 1191, divisione per 2: input falso: 1192, divisione per 2: input vero: 1193, divisione per 2: input falso: 1194, divisione per 2: input vero: 1195, divisione per 2: input falso: 1196, divisione per 2: input vero: 1197, divisione per 2: input falso: 1198, divisione per 2: input vero: 1199, divisione per 2: falseInput vero: 1179, divisione per 2: input falso: 1180, divisione per 2: input vero: 1181, divisione per 2: input falso: 1182, divisione per 2: input vero: 1183, divisione per 2: input falso: 1184, divide per 2: input vero: 1185, divide per 2: input falso: 1186, divide per 2: input vero: 1187, divide per 2: input falso: 1188, divide per 2: input vero: 1189, divide per 2: falso input: 1190, divisione per 2: input vero: 1191, divisione per 2: input falso: 1192, divisione per 2: input vero: 1193, divisione per 2: input falso: 1194, divisione per 2: input vero: 1195, divisione per 2: input falso: 1196, divisione per 2: input vero: 1197, divisione per 2: input falso: 1198, divisione per 2: input vero: 1199, divisione per 2: falseInput vero: 1187, divisione per 2: input falso: 1188, divisione per 2: input vero: 1189, divisione per 2: input falso: 1190, divisione per 2: input vero: 1191, divisione per 2: input falso: 1192, divide per 2: input vero: 1193, divide per 2: input falso: 1194, divide per 2: input vero: 1195, divide per 2: input falso: 1196, divide per 2: input vero: 1197, divide per 2: falso input: 1198, divisione per 2: True input: 1199, divisione per 2: FalseInput vero: 1187, divisione per 2: input falso: 1188, divisione per 2: input vero: 1189, divisione per 2: input falso: 1190, divisione per 2: input vero: 1191, divisione per 2: input falso: 1192, divide per 2: input vero: 1193, divide per 2: input falso: 1194, divide per 2: input vero: 1195, divide per 2: input falso: 1196, divide per 2: input vero: 1197, divide per 2: falso input: 1198, divisione per 2: True input: 1199, divisione per 2: False
Inoltre, anche dividere per altri numeri (diciamo 7) va bene:
import numpy as np
def layer_1_z(x, w1, b1):
return 1 / w1 * x + b1
def layer_2(x, w1, b1, w2, b2):
y1 = layer_1_z(x, w1, b1)
y2 = y1 - np.floor(y1)
return w2 * y2 + b2
def layer_2_activation(x, w1, b1, w2, b2):
y2 = layer_2(x, w1, b1, w2, b2)
# return 1 / (1 + np.exp(-y2))
return (y2 > 0) * 1
def loss(param):
w1, b1, w2, b2 = param
x = np.arange(0, 1000, 1)
y_hat = layer_2_activation(x, w1, b1, w2, b2)
y_true = (x % 7 > 0) * 1
return sum(np.square(y_hat - y_true))
# %%
from sko.GA import GA
ga = GA(func=loss, n_dim=4, size_pop=50, max_iter=100, lb=[1, 0, 1, 0], ub=[32, 1, 2, 1], precision=1)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
for x in range(1001, 1200):
y_hat = layer_2_activation(x, *best_x)
print('input:{},divide by 7:{}'.format(x, y_hat == 0))
input: 1001, divide per 7: input vero: 1002, divide per 7: input falso: 1003, divide per 7: input falso: 1004, divide per 7: input falso: 1005, divide per 7: input falso: 1006, divide per 7: input falso: 1007, divisione per 7: input falso: 1008, divisione per 7: input vero: 1009, divisione per 7: input falso: 1010, divisione per 7: input falso: 1011, divisione per 7: input falso : 1012, divisione per 7: input falso: 1013, divisione per 7: input falso: 1014, divisione per 7: input falso: 1015, divisione per 7: input vero: 1016, divisione per 7: input falso: 1017, divisione per 7: Ingresso falso: 1018, divisione per 7: Ingresso falso: 1019, divisione per 7: Ingresso falso: 1020, divisione per 7: Ingresso falso: 1021, divisione per 7: Ingresso falso: 1022, divisione per 7: Ingresso vero: 1023, divisione per 7: input falso: 1024, divisione per 7: input falso: 1025, divisione per 7: input falso: 1026, divisione per 7: input falso: 1027, divisione per 7: input falso: 1028, divisione per 7 : Input falso: 1029, divisione per 7:Input vero: 1030, divisione per 7: input falso: 1031, divisione per 7: input falso: 1032, divisione per 7: input falso: 1033, divisione per 7: input falso: 1034, divisione per 7: input falso: 1035, divide per 7: input falso: 1036, divide per 7: input vero: 1037, divide per 7: input falso: 1038, divide per 7: input falso: 1039, divide per 7: input falso: 1040, divide per 7: falso input: 1041, divisione per 7: input falso: 1042, divisione per 7: input falso: 1043, divisione per 7: input vero: 1044, divisione per 7: input falso: 1045, divisione per 7: input falso: 1046, divisione per 7: input falso: 1047, divisione per 7: input falso: 1048, divisione per 7: input falso: 1049, divisione per 7: input falso: 1050, divisione per 7: input vero: 1051, divisione per 7: input falso : 1052, divisione per 7: input falso: 1053, divisione per 7: input falso: 1054, divisione per 7: input falso: 1055, divisione per 7: input falso: 1056, divisione per 7: input falso: 1057, divisione per 7: input vero: 1058,divide per 7: input falso: 1059, divide per 7: input falso: 1060, divide per 7: input falso: 1061, divide per 7: input falso: 1062, divide per 7: input falso: 1063, divide per 7: falso input: 1064, divisione per 7: input vero: 1065, divisione per 7: input falso: 1066, divisione per 7: input falso: 1067, divisione per 7: input falso: 1068, divisione per 7: input falso: 1069, divisione per 7: input falso: 1070, divisione per 7: input falso: 1071, divisione per 7: input vero: 1072, divisione per 7: input falso: 1073, divisione per 7: input falso: 1074, divisione per 7: input falso : 1075, divisione per 7: input falso: 1076, divisione per 7: input falso: 1077, divisione per 7: input falso: 1078, divisione per 7: input vero: 1079, divisione per 7: input falso: 1080, divisione per 7: Ingresso falso: 1081, divisione per 7: Ingresso falso: 1082, divisione per 7: Ingresso falso: 1083, divisione per 7: Ingresso falso: 1084, divisione per 7: Ingresso falso: 1085, divisione per 7: Ingresso vero: 1086, dividi per 7:Ingresso falso: 1087, divisione per 7: Ingresso falso: 1088, divisione per 7: Ingresso falso: 1089, divisione per 7: Ingresso falso: 1090, divisione per 7: Ingresso falso: 1091, divisione per 7: Ingresso falso: 1092, divide per 7: input vero: 1093, divide per 7: input falso: 1094, divide per 7: input falso: 1095, divide per 7: input falso: 1096, divide per 7: input falso: 1097, divide per 7: falso input: 1098, divisione per 7: input falso: 1099, divisione per 7: input vero: 1100, divisione per 7: input falso: 1101, divisione per 7: input falso: 1102, divisione per 7: input falso: 1103, divisione per 7: input falso: 1104, divisione per 7: input falso: 1105, divisione per 7: input falso: 1106, divisione per 7: input vero: 1107, divisione per 7: input falso: 1108, divisione per 7: input falso : 1109, divisione per 7: input falso: 1110, divisione per 7: input falso: 1111, divisione per 7: input falso: 1112, divisione per 7: input falso: 1113, divisione per 7: input vero: 1114, divisione per 7: input falso: 1115,divide per 7: input falso: 1116, divide per 7: input falso: 1117, divide per 7: input falso: 1118, divide per 7: input falso: 1119, divide per 7: input falso: 1120, divide per 7: true input: 1121, divisione per 7: input falso: 1122, divisione per 7: input falso: 1123, divisione per 7: input falso: 1124, divisione per 7: input falso: 1125, divisione per 7: input falso: 1126, divisione per 7: input falso: 1127, divisione per 7: input vero: 1128, divisione per 7: input falso: 1129, divisione per 7: input falso: 1130, divisione per 7: input falso: 1131, divisione per 7: input falso : 1132, divisione per 7: input falso: 1133, divisione per 7: input falso: 1134, divisione per 7: input vero: 1135, divisione per 7: input falso: 1136, divisione per 7: input falso: 1137, divisione per 7: input falso: 1138, divisione per 7: input falso: 1139, divisione per 7: input falso: 1140, divisione per 7: input falso: 1141, divisione per 7: input vero: 1142, divisione per 7: input falso: 1143, dividi per 7: input falso:1144, divisione per 7: input falso: 1145, divisione per 7: input falso: 1146, divisione per 7: input falso: 1147, divisione per 7: input falso: 1148, divisione per 7: input vero: 1149, divisione per 7 : Ingresso falso: 1150, divisione per 7: Ingresso falso: 1151, divisione per 7: Ingresso falso: 1152, divisione per 7: Ingresso falso: 1153, divisione per 7: Ingresso falso: 1154, divisione per 7: Ingresso falso: 1155 , divide per 7: input vero: 1156, divide per 7: input falso: 1157, divide per 7: input falso: 1158, divide per 7: input falso: 1159, divide per 7: input falso: 1160, divide per 7: Ingresso falso: 1161, divisione per 7: Ingresso falso: 1162, divisione per 7: Ingresso vero: 1163, divisione per 7: Ingresso falso: 1164, divisione per 7: Ingresso falso: 1165, divisione per 7: Ingresso falso: 1166, divide per 7: input falso: 1167, divide per 7: input falso: 1168, divide per 7: input falso: 1169, divide per 7: input vero: 1170, divide per 7: input falso: 1171, divide per 7: falso input: 1172, dividere per 7:Ingresso falso: 1173, divisione per 7: Ingresso falso: 1174, divisione per 7: Ingresso falso: 1175, divisione per 7: Ingresso falso: 1176, divisione per 7: Ingresso vero: 1177, divisione per 7: Ingresso falso: 1178, divide per 7: input falso: 1179, divide per 7: input falso: 1180, divide per 7: input falso: 1181, divide per 7: input falso: 1182, divide per 7: input falso: 1183, divide per 7: true input: 1184, divisione per 7: input falso: 1185, divisione per 7: input falso: 1186, divisione per 7: input falso: 1187, divisione per 7: input falso: 1188, divisione per 7: input falso: 1189, divisione per 7: input falso: 1190, divisione per 7: input vero: 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso : 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falso: 1199, divisione per 7: falsedivide per 7: input falso: 1175, divide per 7: input falso: 1176, divide per 7: input vero: 1177, divide per 7: input falso: 1178, divide per 7: input falso: 1179, divide per 7: falso input: 1180, divisione per 7: input falso: 1181, divisione per 7: input falso: 1182, divisione per 7: input falso: 1183, divisione per 7: input vero: 1184, divisione per 7: input falso: 1185, divisione per 7: input falso: 1186, divisione per 7: input falso: 1187, divisione per 7: input falso: 1188, divisione per 7: input falso: 1189, divisione per 7: input falso: 1190, divisione per 7: input vero : 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falsa: 1199, divisione per 7: falsedivide per 7: input falso: 1175, divide per 7: input falso: 1176, divide per 7: input vero: 1177, divide per 7: input falso: 1178, divide per 7: input falso: 1179, divide per 7: falso input: 1180, divisione per 7: input falso: 1181, divisione per 7: input falso: 1182, divisione per 7: input falso: 1183, divisione per 7: input vero: 1184, divisione per 7: input falso: 1185, divisione per 7: input falso: 1186, divisione per 7: input falso: 1187, divisione per 7: input falso: 1188, divisione per 7: input falso: 1189, divisione per 7: input falso: 1190, divisione per 7: input vero : 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falsa: 1199, divisione per 7: falseIngresso falso: 1178, divisione per 7: Ingresso falso: 1179, divisione per 7: Ingresso falso: 1180, divisione per 7: Ingresso falso: 1181, divisione per 7: Ingresso falso: 1182, divisione per 7: Ingresso falso: 1183, divide per 7: input vero: 1184, divide per 7: input falso: 1185, divide per 7: input falso: 1186, divide per 7: input falso: 1187, divide per 7: input falso: 1188, divide per 7: falso input: 1189, divisione per 7: input falso: 1190, divisione per 7: input vero: 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falso: 1199, divisione per 7: falsoIngresso falso: 1178, divisione per 7: Ingresso falso: 1179, divisione per 7: Ingresso falso: 1180, divisione per 7: Ingresso falso: 1181, divisione per 7: Ingresso falso: 1182, divisione per 7: Ingresso falso: 1183, divide per 7: input vero: 1184, divide per 7: input falso: 1185, divide per 7: input falso: 1186, divide per 7: input falso: 1187, divide per 7: input falso: 1188, divide per 7: falso input: 1189, divisione per 7: input falso: 1190, divisione per 7: input vero: 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falso: 1199, divisione per 7: falsodivide per 7: input falso: 1185, divide per 7: input falso: 1186, divide per 7: input falso: 1187, divide per 7: input falso: 1188, divide per 7: input falso: 1189, divide per 7: falso input: 1190, divisione per 7: input vero: 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falso: 1199, divisione per 7: falsedivide per 7: input falso: 1185, divide per 7: input falso: 1186, divide per 7: input falso: 1187, divide per 7: input falso: 1188, divide per 7: input falso: 1189, divide per 7: falso input: 1190, divisione per 7: input vero: 1191, divisione per 7: input falso: 1192, divisione per 7: input falso: 1193, divisione per 7: input falso: 1194, divisione per 7: input falso: 1195, divisione per 7: input falso: 1196, divisione per 7: input falso: 1197, divisione per 7: input vero: 1198, divisione per 7: input falso: 1199, divisione per 7: falsedividi per 7: input vero: 1198, dividi per 7: input falso: 1199, dividi per 7: falsedividi per 7: input vero: 1198, dividi per 7: input falso: 1199, dividi per 7: false
Spiegazione:
Ottengo 2 soluzioni diverse. Entrambi sono buoni:
1. peccato come attivazione
2. piano (o int) come attivazione
È impossibile trovare i pesi migliori usando la discesa gradiente e utilizzo l'algoritmo genetico (da scikit-opt )