/
Demek
/
DSam621
Обзор
Документация
Войти
/
Demek
/
DSam621
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
Python/hw2_.py
254 строки
11 KB
d_e_m_e_k
обновление ДЗ2 добавил обучение
07 июн 2026, 12:30
07 июн 2026, 12:30
9399f0f
Код
Авторство
О чём код?
import warnings import os import numpy as np import tensorflow as tf from tensorflow import keras import random # Скрыть предупреждения os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' warnings.filterwarnings("ignore", category=UserWarning, module="keras") def get_non_negative_float(prompt): while True: try: value = float(input(prompt)) if value < 0: print("❌ Ошибка: значение не может быть отрицательным. Попробуйте снова.") continue return value except ValueError: print("❌ Ошибка: введите корректное число.") def get_positive_int(prompt): while True: try: value = int(input(prompt)) if value <= 0: print("❌ Ошибка: значение должно быть больше нуля. Попробуйте снова.") continue return value except ValueError: print("❌ Ошибка: введите целое число.") def normalize_input(total_sum, quantity, avg_price_per_item, discount_percent): return np.array([ min(total_sum / 20000, 1.0), min(quantity / 20, 1.0), min(avg_price_per_item / 3000, 1.0), min(discount_percent / 100, 1.0) ]) def generate_synthetic_data(n_samples=100): """ Генерирует реалистичные данные для обучения: - Сумма: от 500 до 15000 - Кол-во товаров: от 1 до 20 - Скидка: от 0 до 30% - Решение (1 или 0) основано на простых правилах """ X = [] y = [] for _ in range(n_samples): total_sum = random.uniform(500, 15000) quantity = random.randint(1, 20) discount_percent = random.uniform(0, 30) avg_price = total_sum / quantity # Простое "правило покупки": если выгодно decision = int( total_sum > 4000 or discount_percent > 10 or quantity > 8 or avg_price > 600 ) X.append(normalize_input(total_sum, quantity, avg_price, discount_percent)) y.append(decision) return np.array(X), np.array(y) def create_model(): model = keras.Sequential([ keras.layers.Input(shape=(4,)), keras.layers.Dense(8, activation='relu'), keras.layers.Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model # === Главная логика === model_path = "shopping_model.h5" print("=" * 60) print("📊 СИСТЕМА АНАЛИЗА ПОКУПОК — С ИСКУССТВЕННЫМ ИНТЕЛЛЕКТОМ") print("=" * 60) # === Шаг 1: Запрос данных (один раз) === total_sum = get_non_negative_float("Введите сумму покупок (руб.): ") quantity = get_positive_int("Введите количество товаров: ") discount_percent = get_non_negative_float("Введите скидку (%, 0–100): ") if discount_percent > 100: print("⚠️ Скидка > 100% → устанавливаем 0%.") discount_percent = 0 # Расчёты discount_amount = total_sum * discount_percent / 100 price_after_base_discount = total_sum - discount_amount avg_price_per_item = total_sum / quantity additional_discount = 0.0 if price_after_base_discount > 5000: additional_discount = price_after_base_discount * 0.10 final_sum = price_after_base_discount - additional_discount free_shipping = quantity > 10 # === Шаг 2: Работа с нейросетью === X_input = normalize_input(total_sum, quantity, avg_price_per_item, discount_percent) X_input = X_input.reshape(1, -1) if os.path.exists(model_path): print("\n📂 Модель найдена — загружаем...") model = keras.models.load_model(model_path) # === Опциональное дообучение на ваших данных === prediction = model.predict(X_input)[0][0] current_decision = 1 if prediction >= 0.5 else 0 print("\n" + "─" * 60) print("🧠 ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ ПРИНЯЛ РЕШЕНИЕ") print("─" * 60) print(f"→ Вероятность покупки: {prediction*100:.1f}%") print(f"→ Рекомендация: {'✅ Покупаем!' if current_decision == 1 else '⏳ Лучше отложить'}") print(" (Модель обучена на синтетических и ваших предыдущих данных)") else: # === Генерация синтетических данных === print("\n🧠 Генерация синтетических данных (100 примеров)...") X_train_synthetic, y_train_synthetic = generate_synthetic_data(n_samples=100) # === Создание и обучение модели === print("🧠 Обучение модели на синтетических данных...") model = create_model() model.fit(X_train_synthetic, y_train_synthetic, epochs=50, verbose=0) # === Опциональное дообучение на ваших примерах === try: user_choice = int(input("\nХотите добавить свои 1–2 примера для адаптации? (1 — да, 0 — нет): ")) if user_choice == 1: print("\n📝 Введите свои примеры (можно 1–2):") X_user, y_user = [], [] num = int(input("Сколько примеров? (1 или 2): ")) for i in range(num): print(f"\nПример #{i+1}:") train_sum = get_non_negative_float(" Сумма покупки (руб.): ") train_qty = get_positive_int(" Количество товаров: ") train_disc = get_non_negative_float(" Скидка (%): ") train_avg = train_sum / train_qty X_user.append(normalize_input(train_sum, train_qty, train_avg, train_disc)) while True: try: y = int(input(" Решение (1 — покупать, 0 — отложить): ")) if y not in (0, 1): raise ValueError y_user.append(y) break except ValueError: print(" ⚠️ Введите 1 или 0.") X_train = np.vstack([X_train_synthetic, np.array(X_user)]) y_train = np.concatenate([y_train_synthetic, np.array(y_user)]) print("\nДообучение модели на ваших данных...") model.fit(X_train, y_train, epochs=30, verbose=0) except ValueError: print(" ⚠️ Введено некорректное значение — пропускаем дообучение.") model.save(model_path) print(f"✅ Модель сохранена в {model_path}") # Показываем прогноз для ВАШИХ данных prediction = model.predict(X_input)[0][0] current_decision = 1 if prediction >= 0.5 else 0 print( f"\n→ Для текущих данных: {prediction*100:.1f}% → {'✅ Покупаем!' if current_decision == 1 else '⏳ Лучше отложить'}") # === Шаг 3: Вывод отчёта === print("\n" + "─" * 60) print("🧾 ФИНАЛЬНЫЙ ЧЕК") print("─" * 60) print(f"🔹 Исходная сумма корзины: {total_sum:10.2f} руб.") print(f"🔹 Базовая скидка ({discount_percent:.1f}%): -{discount_amount:10.2f} руб.") print(f"🔹 Цена после скидки: {price_after_base_discount:10.2f} руб.") if additional_discount > 0: print(f"🔹 Доп. скидка 10% (за >5000): -{additional_discount:10.2f} руб.") print(f"🔹 ИТОГО К ОПЛАТЕ: {final_sum:10.2f} руб.") print("\n" + "─" * 60) print("📈 АНАЛИЗ КОРЗИНЫ") print("─" * 60) print(f"🔹 Количество товаров: {quantity} шт.") print(f"🔹 Средняя стоимость товара: {avg_price_per_item:10.2f} руб.") print(f"🔹 Бесплатная доставка: {'✅ Да' if free_shipping else '❌ Нет'}") print("\n" + "─" * 60) print("💡 РЕКОМЕНДАЦИИ ПО ОПТИМИЗАЦИИ") print("─" * 60) has_recommendations = False if not free_shipping: needed = 11 - quantity print(f"• Чтобы получить бесплатную доставку:") print(f" → Добавьте ещё {needed} товар(а/ов) ✨") has_recommendations = True if price_after_base_discount <= 5000: needed = 5000 - price_after_base_discount print(f"• Чтобы активировать доп. скидку 10%:") print(f" → Потратьте ещё на {needed:.2f} руб. 💰") has_recommendations = True if avg_price_per_item < 500: print(f"• Средняя стоимость товара низкая ({avg_price_per_item:.0f} руб.)") print(f" → Рассмотрите возможность добавить 1–2 более дорогих позиции 🛍️") has_recommendations = True if not has_recommendations: print("✅ Вы уже получили все возможные бонусы — отлично сработано! 🎉") print("\n" + "─" * 60) print("🏆 ИТОГОВАЯ ОЦЕНКА СДЕЛКИ") print("─" * 60) discount_total_percent = (total_sum - final_sum) / total_sum * 100 if total_sum > 0 else 0 print(f"🔹 Вы сэкономили: {total_sum - final_sum:.2f} руб. ({discount_total_percent:.1f}% от суммы)") if discount_total_percent > 15: print("🔥 Отличная сделка! Вы максимально использовали бонусы магазина! 🎉") elif discount_total_percent > 8: print("👍 Хорошая скидка — вы близки к максимальной выгоде!") elif discount_total_percent > 0: print("✅ Скидка применена — стоит обратить внимание на рекомендации!") else: print("ℹ️ Скидка не применена — добавьте 5000+ руб. для активации бонусов.") print("=" * 60) print("📄 Отчёт сгенерирован успешно.") print("=" * 60)