データについては、(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'))