您的位置:首页 > 其它

2019-07-28【机器学习】无监督学习之聚类 DBSCAN方法及其应用 (在线大学生上网时间分析)...

2019-07-30 21:58 302 查看
原文链接:http://www.cnblogs.com/ymzm204/p/11273071.html

样本:

 

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt

mac2id = dict()
onlinetimes = []
f = open('D:\python_source\Machine_study\mooc课程数据\课程数据\聚类\学生月上网时间分布-TestData.txt', encoding='utf-8')
for line in f:
mac = line.split(',')[2] #获取mac地址
onlinetime = int(line.split(',')[6]) #上网时间,单位为秒
starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])#源数据为,2014-07-20 22:44:18.540000000,提取出22
if mac not in mac2id:
mac2id[mac] = len(onlinetimes) #字典,key-mac,??value-上网时长和上网时间/0,1,2,3,4,5,6,7
onlinetimes.append((starttime, onlinetime))

else:
onlinetimes[mac2id[mac]] = [(starttime, onlinetime)]

real_X = np.array(onlinetimes).reshape((-1, 2)) #二维数组

X = real_X[:, 0:1] #提取出开始时间点
#S = np.log(1 + real_X[:, 1:]) 对数变换
#print(S)
db = skc.DBSCAN(eps=0.01, min_samples=20).fit(X)

#lables为每个数据的簇标签
lables = db.labels_

print('Lables:')
print(lables) #分为7类标签
#输出噪点比例
raito = len(lables[lables[:] == -1])/len(lables)
print('Noise raito:', format(raito, '.2%'))

n_clusters = len(set(lables)) - (1 if -1 in lables else 0) #噪点为-1,如果有噪点,则7-1==6类

print('Estimated nuber of clusters: %d' %n_clusters)
print("Silhouetts Coefficient: %0.3f" %metrics.silhouette_score(X, lables)) #聚类效果评价指标

for i in range(n_clusters):
print('Cluster', i, ':')
print(list(X[lables == i].flatten()))

plt.hist(X, 24)
plt.show()

 效果图

转载于:https://www.cnblogs.com/ymzm204/p/11273071.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐