使用机器学习发现日常模式

2024-05-01 18:37:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经以[时间戳,位置]的格式创建了一个巨大的日常活动日志。例如

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

我可以用什么方法挖掘这些信息来找到

  • 星期天晚上,我可能在旧金山附近
  • “周一下午我可能在门罗公园附近”

问题是

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

Tags: 数据方法函数view信息park格式时间
3条回答

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


以下是如何在pandas数据框中加载数据的方法:

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"

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

[编辑]: 把语言混在一起但又把它固定了下来:分类器是用来进行统计分类的算法。

In machine learning and statistics, classification is the problem of identifying to which of a set of categories (sub-populations) a new observation belongs, on the basis of a training set of data containing observations (or instances) whose category membership is known.[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

这个解决方案的性能取决于您对模式识别的需求有多细。 假设你的要求是把一天分成4部分: Morning,Noon,Evening,Night,让我们调用它们time_slots

现在让我们看看你的日常活动日志有多大,1年,2年,3年?

假设是一年。

所以我们总共有365*4=1460个时间段需要监控。

现在,基于每个time_slot的时间戳创建一个简单的映射。 它从T1开始到T2结束(T1和T2是时间戳,如1365650813354)。

根据日志中的时间戳值,很容易找到它的time_slot,即1月28日晚上,或者 1月30日上午。

您必须将time_slot与place_i_was数据存储在任何具有正确模式的合适数据库中。 这取决于你想要什么样的查询和分析。

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

相关问题 更多 >