3

我創建了格式爲[timestamp,location]的日常活動的大型日誌。例如使用機器學習尋找日常圖案

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

什麼是我能挖掘這些信息找到像

  • 模式的方式「上週日晚上,這是可能的,我在舊金山附近」
  • 「週一下午是可能我是附近門洛帕克」

的問題是,

  • 數據集很大。
  • 通過在時間戳值上應用函數來判斷日期/時間/日是不可能的(除非我們將日期時間值中的時間戳解碼)。
+1

什麼是時間戳的來源?它需要解釋它 – Nishanth 2013-04-11 12:50:19

+0

@ e4e5f4你能詳細說明嗎?爲了簡單起見,讓我們假設,他們是我的foursquare/Facebook檢查的時間戳。或者我的推文與位置。 – Codevalley 2013-04-11 13:38:26

+0

是的,但是什麼是參考?它是從什麼時候開始的滴答計數?起源是什麼? – Nishanth 2013-04-11 13:44:46

回答

2

性能是這個解決方案取決於您對模式識別的要求是多麼的細化。 讓我們假設你的要求劃分爲一天4個部分: Morning,Noon,Evening,Night,讓我們稱他們爲time_slots

現在讓我們來看看你的日常活動日誌有多大,1年,2年,3年?

讓我們假設它是1年。

所以我們總共有365 * 4 = 1460個時隙來監測。

現在,根據每個time_slot的時間戳創建一個簡單的地圖。例如,它從T1開始並在T2結束(其中T1和T2是時間戳,如1365650813354)。

根據日誌中的時間戳值,很容易找到它的time_slot即1月28日晚上或 1月30日上午。

您必須將time_slot與place_i_was數據存儲在具有適當模式的任何合適的數據庫中。 這取決於你想要的種類的查詢和分析。

這樣你就不需要在你的數據集上運行公式,預定義的地圖/數據庫查找就可以達到你的目的。

+0

問題是1)我不控制數據集(我得到它上面的格式),這將是對我來說很難他們每個人我處理它們的時間映射到1460個區域。更糟的是,我有1000個用戶和他們每個人的1年數據。那麼這根本就不會擴展。而且,我必須爲day_of_the_week製作額外的插槽。如果我的粒度是每小時(而不是四個每天),也將根據需要的粒度是8760 – Codevalley 2013-04-11 13:31:06

+1

尋找插槽是一個快速的操作,只是一個模運算。 – DhruvPathak 2013-04-11 17:51:15

2

不確定這些問題需要機器學習,您可以使用常規統計數據。即建立一個概率分佈圖,x - 一天中的時間,y - 它是舊金山的概率。如果時間在ab之間,計算舊金山的概率...


這是如何加載你的數據在數據幀的大熊貓:首先

    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

你如何建議我們識別「一天的時間」從時間戳跨越的記錄1000? – Codevalley 2013-04-11 14:22:32

+0

您的時間戳可能是以UTC爲單位的Unix時代以來的秒數。您可以輕鬆將其分解爲組件。查找'gmtime()'函數。這些日子裏的1000多項記錄是微不足道的。 – 2013-04-11 14:25:35

+0

我在這裏談論數千條記錄。因此,每次我在這裏嘗試一些東西時,預處理調用datetime.fromtimestamp必須被調用數千次。 – Codevalley 2013-04-11 14:38:32

0

,時間戳值轉換爲年 - 月 - 平日:

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()) 

輸出。將時間戳列替換爲年份,月份和工作日對應的3列。

稍後,您可以簡單地按日期的某個範圍的值進行分組,並計算每個位置的實例數。

4

我在這裏看不到您的問題。因爲它是一個時間戳,從時期開始計算秒數,您只需將模數運算符應用到值爲感興趣的範圍內。如果你訓練一個分類器,你應該能夠預測每一個即將到來的地方。主要問題不是性能,因爲學習只是現在和現在完成,而是如何更新學習數據集。 如前所述,您不必爲此使用機器學習,但是如果您想使用機器學習來完成此任務,則基本上可以在您的1d數據集上使用k-nearest-neighbor來完成。

[編輯]: 混合語言,但固定它:分類器是將執行統計分類的算法。

在機器學習和統計,分類識別的問題,其一組類別(亞羣體)一個新的觀察所屬的訓練集包含觀察數據的基礎上的(或實例)的類別成員已知。 [1]

由於我只使用了sklearn做這樣的事情,以下是你如何可以使用k最近鄰分類[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 2013-04-11 14:39:59

+0

@Codevalley您需要做更多的閱讀,而不是我們在Stackoverflow上提供的內容。嘗試https://en.wikipedia.org/wiki/Statistical_classification – 2015-04-12 00:22:46

1

轉換時間戳成標記: 「週日早晨」。

然後做關聯規則挖掘獲得的規則,如

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

,你只保留那些規則,其中所希望的位置上正確的發生。

+0

對我來說,整個問題是第一部分。將'時間戳轉換爲令牌'。我如何有效地做到這一點? – Codevalley 2013-04-12 05:10:38

+0

將日期時間和輸出解析爲期望的令牌。 '如果週日在[「星期六」,「星期日」]:打印「週末」' – 2013-04-13 01:29:21