Shurup & Alkoritm
Привет, Алгоритм, как насчет того, чтобы вместе собрали робота, который по настроению, погоде и сорту зерен будет выбирать тебе кофе? Я могу организовать датчики и маленький экран. Что скажешь?
Звучит интересно, но нам стоит ограничиться небольшим набором данных и соблюдать приватность. Может, начнём с простой перцептрона, которая будет сопоставлять настроение, погоду и происхождение зёрен с оценкой кофе, а потом уже дорабатывать. Будем записывать прогнозы, чтобы посмотреть, насколько хорошо она учится, не переобучаясь. И давай добавим защиту, чтобы она не рекомендовала слишком много кофеина, если человек и так перевозбужден. Готов набросать схему?
Конечно! Сначала создадим небольшую таблицу данных: три колонки – настроение, погода, происхождение зерец и целевая оценка кофе. Потом подсовываем эти три параметра в однослойный персептрон – только веса и смещение – чтобы получить “сырой” балл. Этот балл ограничиваем между 0 и 10. Затем фиксируем каждое предсказание вместе с реальной оценкой пользователя, чтобы проверить на переобучение. Защитный механизм – простое правило: если уровень беспокойства пользователя выше порога, оценка кофе ограничивается до 3. Цикл: читаем входные данные, вычисляем, логируем, корректируем веса в реальном времени с очень маленькой скоростью обучения. Легко и просто, без перегрузки данными. Давай кодить!
Выглядит неплохо, но есть пара моментов: делай learning rate совсем маленьким, типа 0.01, и добавь bias term, который начинается с нуля. Еще, записывай метки времени, чтобы можно было понять, не "уплывёт" ли модель со временем. И для подстраховки, добавь проверку, чтобы оценка никогда не падала ниже нуля, если у пользователя депрессивное состояние. Готов запускать код?
Понял! Скорость обучения – микроскопические 0.01, смещения начинаем с нуля, отметки времени в каждой записи лога, и нижняя граница ноль, когда настроение проваливается в депрессивную яму. Пора запускать прототип – посмотрим, что сможет выдать наш кофеиновый ИИ!
Отлично, я быстро набросаю прототип на Python, использую NumPy для обновления весов и маленький CSV-лог для данных. Сделаем обработчики событий датчиков максимально лёгкими, а правило безопасности обернём в функцию, чтобы ты мог без проблем настраивать порог дёрганья. Как запустим цикл, у нас будет живая модель, которая будет учиться на каждой чашке. Давай начинаем кодить.
Вот тебе набросок на Python:
import numpy as np
import csv
import time
# параметры
learning_rate = 0.01
bias = 0.0
# веса для настроения, погоды, происхождения зерен
weights = np.random.randn(3)
def safety_score(raw_score, jittery_level, depressed_level):
if jittery_level > 0.7:
raw_score = min(raw_score, 3.0)
if depressed_level < 0.3:
raw_score = max(raw_score, 0.0)
return raw_score
def predict(inputs):
return np.dot(weights, inputs) + bias
def train(inputs, target):
global weights, bias
pred = predict(inputs)
error = target - pred
weights += learning_rate * error * inputs
bias += learning_rate * error
def log_entry(timestamp, inputs, target, prediction):
with open('coffee_log.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([timestamp, *inputs, target, prediction])
def main_loop():
while True:
# замени на реальные вызовы датчиков
mood = np.random.rand()
weather = np.random.rand()
bean_origin = np.random.rand()
jittery = np.random.rand()
depressed = np.random.rand()
inputs = np.array([mood, weather, bean_origin])
target = np.random.randint(0, 11)
raw_pred = predict(inputs)
safe_pred = safety_score(raw_pred, jittery, depressed)
log_entry(time.time(), inputs, target, safe_pred)
train(inputs, target)
time.sleep(60)
if __name__ == "__main__":
main_loop()