Вопрос или проблема
Я бы хотел создать рекомендательную систему для приложения умного дома. Я собираю данные в базе данных временных рядов. Приложение отслеживает состояние включения/выключения умной лампы и может создавать ежедневные рутины. Я хотел бы создать уведомления для пользователя, например: “Похоже, вы обычно используете свою лампу с 8:00 до 10:00. Хотели бы вы создать рутину для этого?”.
Я новичок в области данных и машинного обучения, и хотел бы спросить, какой алгоритм или метод машинного обучения я должен использовать для этой задачи. Кто-то порекомендовал мне Facebook Prophet, но, как я вижу, эта библиотека может только предсказывать будущие события, а не периодичность данных временных рядов. Вы знаете какую-нибудь библиотеку или алгоритм?
На изображении ниже вы можете увидеть детализированную проблему. Есть почасовое состояние включения/выключения лампы ежедневно в зеленом цвете и в синем цвете результат, который я хотел бы получить: периоды, в которые лампа обычно включена.
Смотря на ваши данные – самый простой способ – создать среднее за последние N дней по часам бинарного индикатора – и затем использовать порог (основанный на экспериментах) для бинаризации.
например, если ваше почасовое среднее за последние 10 дней выглядит так:
0, 0, 0.6, 0.8, 0.9, 1, 0.9, 0.7, 0, 1, 1, 1, 0
Тогда порог 0.8 для бинаризации даст следующий результат:
0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0
И тогда вы могли бы использовать временные срезы, связанные с единицами, для рекомендации.
Это может быть самым простым, что вы можете сделать – но могут быть и более сложные алгоритмы.
Я не думаю, что вам нужно машинное обучение для этого. Во-первых, предположим, что каждый шаблон повторяется ежедневно. Извлеките характеристику лампы, а затем измените ее форму на (n, 24), где n – это количество дней, за которые у вас есть данные. Чтобы добавить смещение по актуальности, вы можете взять m самых недавних из n дней. Отсюда вы можете применить тот же процесс, который предлагает Джаярам.
Однако, что если вы не знаете период шаблона в характеристике? Чтобы это выяснить, вы могли бы использовать Быстрое преобразование Фурье. Ищите пики на вашем графике БПФ, это и есть периоды. Будьте осторожны, так как обычно для одной характеристики может быть несколько периодов, то есть несколько пиков на графике.
Ответ или решение
Чтобы выявить периодичность в данных временных рядов для создания системы рекомендаций в приложении «умный дом», вам нужно учитывать несколько аспектов обработки временных данных. Давайте рассмотрим предложенные методы и подходы.
1. Понимание задачи
Ваше приложение для «умного дома» регистрирует состояние лампы (включена/выключена) на протяжении времени. Цель состоит в том, чтобы определить, в какие часы чаще всего используется лампа, и на основе этой информации генерировать консультации для пользователей о создании рутинных задач.
2. Методы анализа периодичности
A. Сглаживание данных
Первый шаг включает в себя сглаживание временного ряда для устранения шумов. Чтобы получить периодичность, можно использовать скользящее среднее. Например, вам будет нужно рассчитать посуточные средние значения по часам на основе данных за последние N дней. Ваша формула может выглядеть так:
[ \text{Скользящее среднее} = \frac{1}{N} \sum_{i=0}^{N-1} X[i] ]
где (X[i]) – это данные по состоянию лампы в каждом часовом интервале.
B. Пороговое значение для бинаризации
После нахождения скользящего среднего вы можете установить пороговое значение для бинаризации данных. Это позволит вам четко определить часы, когда лампа используется:
threshold = 0.8
binary_state = (moving_average > threshold).astype(int)
В результате вы получите бинарный вектор, который показывает, в какие часы лампа чаще всего включается.
C. Метод разбивки и подгонки
Разбейте данные на часы для каждого дня и примените аналогичный подход, например используя последние m дней для получения актуальных данных. Это позволит вам учитывать недавние паттерны пользования.
3. Использование методов обработки сигналов
Если вам нужно выявить неочевидные периодические паттерны, рассмотрите возможность использования Быстрого преобразования Фурье (FFT). Эта техника позволяет анализировать частотное содержание временного ряда и может помочь выявить основной период или частоты, которые повторяются.
from scipy.fft import fft
import numpy as np
# Применение FFT к данным
data_fft = fft(binary_state)
frequencies = np.abs(data_fft)
Изучив график амплитуды и частоты, вы сможете выявить пики, которые укажут на периодичности использования.
4. Машинное обучение и библиотеки
Хотя можно обойтись без сложных машинных алгоритмов, если вы хотите использовать ML для более глубокого анализа шаблонов, можете рассмотреть такие библиотеки как scikit-learn
для кластеризации или tsfresh
для извлечения признаков во временных рядах. Однако для вашей текущей задачи достаточно базовых методов анализа данных.
5. Выводы и рекомендации
- Используйте скользящее среднее и бинаризацию для идентификации частых интервалов.
- Подумайте о применении FFT для выявления скрытых периодов.
- Рассмотрите возможность работы с данными в виде двумерных массивов, где строки — это дни, а столбцы — часы.
Следуя указанным шагам, вы сможете эффективно извлечь полезную информации из временных рядов и добавить динамичные и персонализированные рекомендации для пользователей вашего приложения «умный дом».