学生のオンライン時間の分布クラスタリング

データについては、(Computer F Disk)または(Tencent Weiyun File "Redhur's Advanced")の{python data—test1}を参照してください
ここに画像の説明を挿入します
。1。インターネットの時間(インターネットの時間)に応じたクラスタリング
ここに画像の説明を挿入します

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
 
mac2id = dict()
"""
在mac2id这个字典里:
键key是MAC地址
值value是字典里面对应的序号
"""
onlinetimes = []
f = open("F:/python数据/test1.txt",encoding='utf8')
for line in f:
    data = line.split(',')
    mac = data[2] #读取Mac地址
    onlinetime = int(data[6])   #读取上网时长
    starttime =  int(data[4].split(' ')[1].split(':')[0])  #读取开始时间(我们只要年月日时分秒里的“时”)

    mac2id[mac] = len(onlinetimes)  #len(onlinetimes)就是此时对应的onlinetimes里面的元素个数,mac2id的内容见下面
    onlinetimes.append((starttime,onlinetime))#onlinetimes里面的内容见下面

#onlinetimes里面的内容是[(22, 1558), (12, 40261), (22, 1721), (23, 351), (16, 23564),,,]
#mac2id这个字典里面是{'A417314EEA7B': 0, 'F0DEF1C78366': 1, '88539523E88D': 2,,,,'3CDFBD175878': 287, '002427FE3712': 288}

real_X = np.array(onlinetimes).reshape((-1,2)) #参数-1可以自动确定行数

X = real_X[:,0:1] # 截取第一列(也就是“上网时间”),我们是要根据上网的时间进行蔟类

'''
real_X为:
[[    22   1558]
 [    12  40261]
 [    22   1721]
 [    23    351]
 [    16  23564]
 [    23   1162]
 [    22   3540]
 ...
 ]


X为:
[[22]
 [12]
 [22]
 [23]
 [16]
 [23]
 [22]
 ...
 ]
'''

db = skc.DBSCAN(eps=0.01,min_samples=20,metric = 'euclidean').fit(X) #调用Dbscan的的方法进行训练
# eps:两个样本被看作邻居节点的最大距离
# min_sample:簇的样本数
# metrics:距离计算方式(默认欧几里得距离)
 
labels = db.labels_
print("Labels")
print(labels)
ratio = len(labels[labels[:]==-1]) / len(labels) # 判定噪声数据(label被打上-1)数据所占的比例
print("Noise ratio:{:.2f}".format(ratio)) #输出噪声数据所占的比例

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)  #减去噪声数据-1占的位置
print("Estimate number of clusters:%d"%n_clusters_)#输出蔟的个数

print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))#输出蔟类效果评价指标(轮廓系数)
#轮廓系数(Silhouette Coefficient)的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
 
for i in range(n_clusters_):
    print("Cluster",i,":")
    print(list(X[labels==i].flatten()))
    # flatten()方法:将numpy对象(如array、mat)折叠成一维数组返回
 
plt.hist(X,24)
plt.show()

ここに画像の説明を挿入します
ここに画像の説明を挿入します
同じ考えの質問の例:

import numpy as np
city=['太原','北京','上海','成都','西安','南京','广州','西宁']
rank=[  2,    0,      0,     1,     1,    1,    0,      2  ] #城市对应的排名
ranks=np.array(rank)
citys=np.array(city)

print(ranks[:]==2)  #[False False False  True  True  True False False]
print('----------------------------------------------------')

num=len( ranks[ranks[:]==2] )   #ranks里面元素等于2的元素的数量(也就是排名第二的城市的数量)
print(num)
print('----------------------------------------------------')

print( citys[ranks[:]==2]  )  #输出排名第二的城市
print('----------------------------------------------------')

print( set(ranks) )
print('----------------------------------------------------')

for i in range( len(set(ranks)) ):
    print('排名第',i,'的城市是:')
    print( citys[ranks[:]==i] )
print('----------------------------------------------------')

ここに画像の説明を挿入します

2.オンラインで費やされた合計時間に基づくクラスタリング

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics

 
mac2id = dict()
"""
key是MAC地址
value是开始上网时间和上网时长
"""
onlinetimes = []
f = open("F:/python数据/test1.txt",encoding='utf8')
for line in f:
    data = line.split(',')
    mac = data[2] #读取Mac地址
    onlinetime = int(data[6])   #读取上网时间
    starttime =  int(data[4].split(' ')[1].split(':')[0])  #读取开始时间(我们只要年月日时分秒里的“时”)

    mac2id[mac] = len(onlinetimes)  #len(onlinetimes)就是此时对应的onlinetimes里面的元素个数,mac2id的内容见下面
    onlinetimes.append((starttime,onlinetime))#onlinetimes里面的内容见下面

#onlinetimes里面的内容是[(22, 1558), (12, 40261), (22, 1721), (23, 351), (16, 23564),,,]
#mac2id这个字典里面是{'A417314EEA7B': 0, 'F0DEF1C78366': 1, '88539523E88D': 2,,,,'3CDFBD175878': 287, '002427FE3712': 288}

#-----------------------------------------以下内容进行了改动-------------------------------------------------------------

real_X = np.array(onlinetimes).reshape((-1,2)) #参数-1可以自动确定行数

X = real_X[:,1:] # 截取第二列(也就是“上网的总时长”)我们这次根据上网的总时长进行蔟类

X=np.log(1+real_X[:,1:])#上网的总时长太大了,都是几千,我们要进行对数化处理
 
db = skc.DBSCAN(eps=0.14,min_samples=10).fit(X) #调用Dbscan的的方法进行训练
# eps:两个样本被看作邻居节点的最大距离
# min_sample:簇的样本数
# metrics:距离计算方式(默认欧几里得距离)
 
labels = db.labels_
print("Labels")
print(labels)
ratio = len(labels[labels[:]==-1]) / len(labels[:]) # 判定噪声数据(label被打上-1)数据所占的比例
print("Noise ratio:{:.2f}".format(ratio)) #输出噪声数据所占的比例
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print("Estimate number of clusters:%d"%n_clusters_)#输出蔟的个数
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))#输出蔟类效果评价指标(轮廓系数)
#轮廓系数(Silhouette Coefficient)的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
 
for i in range(n_clusters_):
    print("Cluster",i,":")
    count=len(X[labels==i])
    mean=np.mean(real_X[labels==i][:,1])
    std=np.std(real_X[labels==i][:,1])
    print('\t number of sample:',count)
    print('\t mean of sample:',format(mean,'.1f'))
    print('\t std of sample:',format(std,'.1f'))
 

ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_45014721/article/details/114653603