3

Я создал огромный журнал ежедневной активности в формате [timestamp, location]. НапримерПоиск ежедневных шаблонов с машинным обучением

[{1365650747255, 'san francisco'}, 
{1365650743354, 'san francisco'}, 
{1365650741349, 'san mateo'}, 
{1365650756324, 'mountain view'}, 
... 
{1365650813354, 'menlo park'}] 

Каковы пути я могу противоминной эту информацию, чтобы найти модели как

  • «в воскресенье вечером, вполне вероятно, что я рядом с Сан-Франциско»
  • «В понедельник после обеда это Возможно, что я рядом с Менло-парк»

проблема заключается в том, что

  • Набор данных огромен.
  • Невозможно судить о дате/времени/дне, применяя функцию к значению отметки времени (если мы не декодируем временную метку в значениях времени даты).
+1

Каков источник временной метки? Его необходимо для толкования – Nishanth

+0

@ e4e5f4 Можете ли вы уточнить? для простоты, допустим, это временные метки моих четырехзначных/facebook проверок. Или мои твиты с местами. – Codevalley

+0

Да, но какая ссылка? это количество отсчетов, начиная с? Каково происхождение? – Nishanth

ответ

2

Производительность - это решение, зависит от того, насколько важно ваше требование для распознавания образов. Давайте предположим, что ваше требование делит день на 4 части: Morning,Noon,Evening,Night, назовём их time_slots

Теперь давайте посмотрим на то, как велика ваша ежедневник деятельность, 1 год, 2 года, 3 года?

позволяет предположить, что это 1 год.

Итак, у нас есть общее количество 365 * 4 = 1460 временных интервалов для наблюдения.

Теперь создайте простую карту на основе временных меток для каждого time_slot. Например. Он начинается с T1 и заканчивается на T2 (где T1 и T2 являются отметками времени, такими как 1365650813354).

Основываясь на значении временной отметки в вашем журнале, легко найти ее time_slot i.e. Evening от 28 января или Утро от 30 января.

Вам нужно будет хранить time_slot vs place_i_was данные в любой подходящей базе данных с соответствующей схемой. Это зависит от типа запросов и анализа, которые вы хотели бы получить.

Таким образом, вам не нужно будет запускать формулы на вашем наборе данных, и предопределенный поиск карты/базы данных будет служить вашей цели.

+0

Проблема 1) Я не контролирую набор данных (я получаю его в вышеуказанном формате), мне было бы сложно отображать их до 1460 зон каждый раз, когда я их обрабатываю. Еще хуже, что у меня 1000 пользователей и 1 год данных каждого из них. Тогда это не будет масштабироваться. Кроме того, мне нужно будет сделать дополнительные слоты для day_of_the_week. И если моя гранулярность будет ежечасно (вместо четырех в день), то будет 8760. – Codevalley

+1

Поиск слота - это быстрая операция, просто операция по модулю, основанная на требуемой детализации. – DhruvPathak

2

Не уверены, что эти вопросы требуют машинного обучения, для этого вы можете использовать регулярную статистику. То есть построить график распределения вероятности, x - время суток, y - вероятность, что это Сан-Франциско. Рассчитайте вероятность Сан-Франциско, если время между a и b ...


Это как загрузить данные в панд DataFrame:

from __future__ import print_function, division 
import pandas as pd 
import datetime 

df = pd.read_csv("data.csv", 
       names=["timestamp","location"], 
       parse_dates=["timestamp"], 
       date_parser=lambda x:datetime.datetime.fromtimestamp(int(x)/1000)) 
print(df.head()) 

Выходы:

    timestamp   location 
0 2013-04-11 04:25:47.255000 "san francisco" 
1 2013-04-11 04:25:43.354000 "san francisco" 
2 2013-04-11 04:25:41.349000  "san mateo" 
3 2013-04-11 04:25:56.324000 "mountain view" 
4 2013-04-11 04:26:53.354000  "menlo park" 
+0

И как вы предлагаете нам идентифицировать «время дня» от отметки времени по тысячам записей? – Codevalley

+0

Ваша временная метка - это, вероятно, количество секунд с момента Unix в UTC. Вы можете легко разбить его на компоненты. Посмотрите функцию 'gmtime()'. И 1000s записей - это небольшая сумма в эти дни. –

+0

Я говорю о тысячах записей здесь. Поэтому вызов предварительной обработки datetime.fromtimestamp нужно называть тысячами раз каждый раз, когда я что-то пробую здесь. – Codevalley

0

Во-первых, преобразовать значение временной метки в год-месяц-день недели. Замените столбец временной метки на 3 столбца, соответствующие году, месяцу и буднему дню.

Позже вы могли просто группировать определенный диапазон значений для дат и подсчитывать количество экземпляров для каждого местоположения.

4

Я не вижу вашей проблемы здесь. Поскольку это временная метка, отсчитывающая секунды от эпохи, вам нужно применить только оператор modulo, значение которого представляет собой диапазон интересов. Если вы обучите классификатор, вы сможете предсказать каждое предстоящее место. Основная проблема заключается не в производительности, а в том, что обучение выполняется только сейчас, а затем, но как обновить изученный набор данных. Как уже говорилось, вам не нужно использовать машинное обучение для этого, но если вы хотите сделать это с помощью машинного обучения, это можно сделать в основном с помощью k-ближайшего соседа в вашем 1d наборе данных.

[EDIT]: Смешанные языки, но исправлены: классификатор - это алгоритм, который будет выполнять статистическую классификацию.

В машинном обучении и статистике, классификация является проблемой определения того, какой из множества категорий (субпопуляций) новое наблюдение принадлежит, на основе обучающего набора данных, содержащих наблюдение (или экземпляры), членство в которых известно. [1]

Как я только использовал sklearn делать такие вещи, следующее минималистичный пример того, как можно использовать к-ближайших соседей классификатором [2]. Чтобы иметь возможность классифицировать, вам нужно изменить строки на числа, а затем подготовить классификатор к данным тестового набора данных, после чего вы сможете предсказать местоположение для новой заданной временной метки.

import numpy as np 
from sklearn.neighbors import KNeighborsClassifier 


data = [[1365650747255, 'san francisco'], 
     [1365650743354, 'san francisco'], 
     [1365650741349, 'san mateo'], 
     [1365650756324, 'mountain view'], 
     ... 
     [1365650813354, 'menlo park']] 

# Map location strings to integers and replace 
location_mapping = {} 
location_index = 0 
for index, (time, location) in enumerate(data): 
    if(not location_mapping.has_key(location)): 
     location_mapping[location] = location_index 
     location_index += 1 

    data[index][1] = location_mapping[location] 

inverse_location_mapping = {value:key for key, value in location_mapping.items()} 

data = np.array(data) 
week = 60 * 60 * 24 * 7 

# Setup classifier 
classifier = KNeighborsClassifier(n_neighbors=10) 

# Train classifier on given data 
classifier.fit(data[:, 0] % week, data[:, 1]) 

# Predict desired location 
prediction = classifier.predict([[1365444444444 % week]])) 
print(inverse_location_mapping[prediction]) 

[1]: http://en.wikipedia.org/wiki/Statistical_classification

[2]: http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

+0

Можете ли вы немного рассказать об этом. Что такое классификатор? – Codevalley

+0

@Codevalley вам нужно будет сделать гораздо больше чтения, чем то, что мы можем предоставить в Stackoverflow. Попробуйте https://en.wikipedia.org/wiki/Statistical_classification –

1

Преобразование метки времени в лексемы: "воскресенье утром".

Затем сделать объединение горно правило, чтобы получить такие правила, как

night => home 
sunday morning => running in the park 

где вы только сохранить эти правила, где желаемые места происходят справа.

+0

Вся проблема для меня - первая часть. Преобразуйте метку времени в токены. Как мне это сделать эффективно? – Codevalley

+0

Проанализируйте дату и время вывода нужных токенов. 'если будний день в [" суббота "," воскресенье "]: печатать" выходные "' –

Смежные вопросы