我对聚类还比较新手。我使用tweepy提取了一个包含许多行的Twitter数据集:
样本数据:
tweet | ID | date |
---|---|---|
NSW Demons – Watch Melbourne v Sydney tonight | 1387339243786182657 | 2021-05-08 05:55:30 |
Brown in and Harmes returns, Melb v Rich match | 1387332484715581440 | 2021-05-08 05:40:45 |
Kick-off is at 7:10 PM from the Docklands. | 1385474911448096770 | 2021-05-08 05:35:21 |
“RT @melbournefc: Kicking with Choco. | 1385474643541127168 | 2021-05-08 05:30:15 |
如何应用聚类算法来根据日期和时间找到聚类?这样我就可以每小时检索推文/转发活动,并生成一个模式。
例如:
如果用户在凌晨1点到2点之间发推文/转发,那么该推文/转发属于第1簇
如果用户在凌晨2点到3点之间发推文/转发,那么该推文/转发属于第2簇,依此类推。
回答:
如果您的规则是特定的,即凌晨1点到2点之间的所有推文都应聚为一簇,凌晨2点到3点之间的推文也应如此,那么这里不需要算法。您只需使用条件赋值来相应地分配簇,例如:
import pandas as pddate = pd.Series(["2021-05-08 05:55:30", "2021-05-08 05:40:45", "2021-05-08 05:35:21", "2021-05-08 05:30:15"], name='date')date = pd.to_datetime(date).to_frame()# 相应地分配簇IDdate['cluster'] = 0 # 默认# 凌晨1点到2点date.loc[(date['date'].dt.hour > 1) & (date['date'].dt.hour <= 2), 'cluster'] = 1# 凌晨2点到3点date.loc[(date['date'].dt.hour > 2) & (date['date'].dt.hour <= 3), 'cluster'] = 2
否则,如果您想应用聚类算法,例如kmeans
,自动对日期列进行聚类学习,我建议您将它们转换为Unix时间戳秒,这样它们就变成了数值,可以输入到模型中:
import pandas as pddate = pd.Series(["2021-05-08 05:55:30", "2021-05-08 05:40:45", "2021-05-08 05:35:21", "2021-05-08 05:30:15"])date_unix = (pd.to_datetime(date) - pd.Timestamp("1970-01-01")) // pd.Timedelta("1s")print(date_unix)
输出
0 16204533301 16204524452 16204521213 1620451815Name: date, dtype: int64
然后您可以对date_unix
应用sklearn
中的KMeans
聚类算法
from sklearn.cluser import KMeanskm = KMeans(n_clusters=2)
这里,n_clusters是一个可以根据您的知识进行调整的参数。np.expand_dims
将大小为3
的数组转换为3 x 1
的矩阵,因为模型通常期望一个矩阵而不是一个向量。然后为您的数据拟合模型:
km.fit(np.expand_dims(date_unix, axis=1))
然后预测
cluster_id = km.predict(np.expand_dims(date_unix, axis=1))print(cluster_id)
输出
[1 0 0 0]
您可以看到算法将第一个日期聚为一簇,将其他三个日期聚为另一簇。因为后三个日期彼此更接近。