之前从csv获取了数据,但是我们的目的是用机器学习的方式对其分类。目测使用sklearn的机器学习库,所以要把数据处理成符合要求的格式。
import time
import numpy as np
from sklearn import cluster,datasets
首先是我们需要的一些模块,time就是时间处理的模块,这里的作用就是把表示时间的字符串转换成时间戳,这样就可以计算字符串代表的时间的含义了。numpy个人理解就是可以让python实现基本的matlab功能,也就是说是矩阵处理和基本数学处理的模块。sklearn就是机器学习模块了。十分强大。
def clearDic(dic,number):#delet the unfitable records
dicb = dic.copy()
for k in dic:
if len(dic[k].keys()) != 20:
del dicb[k]
return dicb#retrun the clear dictionary
这是将之前处理好的字典格式的记录中的残缺数据删除,只保留下具有完整数据组的记录。
def dic2list(dic):#transfer the dict to list for the convienence of the sklearn lib
resultList = []#the list to store the result
tempList = []
for k in dic:
for seKey in dic[k]:
tempList = tempList+dic[k][seKey]
resultList.append(tempList)
tempList = []
return resultList
这段代码是将字典格式转换成list格式,之前不直接转成list格式是因为我们要保留公交路线的名称记录,虽然现在一想似乎没有什么作用,但是,就当做个编码冗余吧,万一需要呢。
def str2float(stList)#transfer the str formate to float formate
for ele in stList:
for cnt in range(0,len(ele)):
if cnt%2 == 0:
ele[cnt]=time.mktime(time.strptime('2016-01-01 '+ele[cnt],'%Y-%m-%d %H:%M:%S'))-time.mktime(time.strptime('2016-01-01 0:00:00','%Y-%m-%d %H:%M:%S'))
else:
ele[cnt] = float(ele[cnt])
return stList
由于我们记录中的数据格式都是str的,所以需要转成float才能送入sklearn中进行聚类。这段代码就是把记录中的字符串变成了可识别的数字。
def skML(dataList,num):
data = np.array(dataList)
k_means = cluster.KMeans(num)
k_means.fit(data)
result = k_means.labels_
return result,k_means
最后就是把这些处理好的记录进行聚类,这次先用最简单的Kmeans聚类。sklearn还是有很多值得学习的地方,而且其官方文档写的也不错,链接如下:
http://scikit-learn.org/stable/index.html
而网上似乎详细介绍这个开源库的文章很少。虽然没有细看,但似乎这是一个学习机器学习的好工具。以后可以写sklearn的教程。