3

我以 [timestamp, location] 格式创建了一个巨大的日常活动日志。例如

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

我可以通过哪些方式挖掘这些信息以找到类似的模式

  • “周日晚上,我很可能在旧金山附近”
  • “周一下午我可能在门洛帕克附近”

问题是

  • 数据集很大。
  • 通过对时间戳值应用函数来判断日期/时间/日期似乎是不可能的(除非我们将时间戳解码为日期时间值)。
4

5 回答 5

4

我在这里看不到你的问题。由于它是从纪元开始计算秒数的时间戳,因此您只需应用模运算符,其值为感兴趣的范围。如果你训练一个分类器,你应该能够预测每个即将到来的地方。主要问题不是性能,因为学习只是偶尔进行,而是如何更新学习的数据集。如前所述,您不必为此使用机器学习,但是如果您想使用机器学习来完成,这基本上可以使用一维数据集上的 k 最近邻来完成。

[编辑]: 混合语言但修复它:分类器是将进行统计分类的算法。

在机器学习和统计中,分类是根据包含已知类别成员的观察(或实例)的训练数据集来识别新观察属于一组类别(子群体)中的哪一个的问题。[ 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

于 2013-04-11T14:26:13.927 回答
2

不确定这些问题需要机器学习,您可以使用常规统计数据。即建立一个概率分布图,x- 一天中的时间,y- 概率它是旧金山。a如果时间介于和b...之间,计算旧金山的概率


这是在 pandas 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"
于 2013-04-11T14:20:33.480 回答
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_slotvs place_i_was 数据存储在具有适当架构的任何合适的数据库中。这取决于您想要的查询和分析类型。

这样您就不需要在数据集上运行公式,并且预定义的地图/数据库查找将满足您的目的。

于 2013-04-11T13:03:15.303 回答
1

将时间戳转换为标记:“星期天早上”。

然后进行关联规则挖掘,得到规则如

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

您只保留这些规则的地方,所需的位置出现在右侧。

于 2013-04-11T22:31:08.320 回答
0

首先,将时间戳值转换为年-月-工作日。将时间戳列替换为对应于年、月和工作日的 3 列。

稍后,您可以简单地按日期值的特定范围进行分组,并计算每个位置的实例数。

于 2013-04-11T14:25:30.807 回答