文章中代码和数据来源于mooc机器学习应用,下面先附上链接:https://www.icourse163.org/course/BIT-1001872001,数据集和slide的获取可以查看本专辑case 0中的相应链接。
下面简单地介绍一下代码
首先是调用相应地包:
import numpy as np
import matplotlib.pyplot as plt
import sklearn.cluster as skc
from sklearn import metrics
导入数据:
mac2id=dict()
onlinetimes=[]
f=open('/Users/Desktop/Python机器学习应用/mooc课程数据/课程数据/聚类/学生月上网时间分布-TestData.txt',encoding='utf-8')#读取文件中的数据
for line in f:#将用得到的数据保存下来,至于为什么这样保存可能还是要看一下课程的slide
mac=line.split(',')[2]#mac地址
onlinetime=int(line.split(',')[6])#上网时长
starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])#开始上网时间
mac2id[mac]=len(onlinetimes)#我们把它加入到mac2id中
onlinetimes.append((starttime,onlinetime))#在onlinetimes中增加一条上网记录
数据预处理:
#print(onlinetimes)
real_X=np.array(onlinetimes).reshape((-1,2))#改变数组的形状,如果好奇是怎么改变的可以把上下两个print打开
#print(real_X)
X=real_X[:,0:1]#得到real_X中的上网开始时间
#print(X)
模型计算:
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)#最小距离是0。01,最少样本数是20
labels=db.labels_#保存标签
输出结果:
print('Labels:')
print(labels)#打印标签
raito=len(labels[labels[:]==-1])/len(labels)#计算噪音数据的比例
print('Noise raito:',format(raito,'.2%'))#打印噪音数据的比例
n_clusters_=len(set(labels))-(1 if -1 in labels else 0)#计算簇标签的个数,忽略噪音类
print('Estimated number of clusters:%d'% n_clusters_)#打印类的个数
print('Silhouette Coefficient:%0.3f'%metrics.silhouette_score(X,labels))#计算轮廓系数,越接近1表示聚类效果越好
for i in range(n_clusters_):#打印各簇标号以及各簇内数据
print('Cluster ',i,':')
print(list(X[labels==i].flatten()))
plt.hist(X,24)
plt.show()