人工智能——DBSCAN密度聚类(Python)

数据介绍:

现有大学校园网的日志数据,290条大学生的校园网使用情况数据,数据包

括用户ID,设备的MAC地址,IP地址,开始上网时间,停止上网时间,上

网时长,校园网套餐等。利用已有数据,分析学生上网的模式。

实验目的:

通过DBSCAN聚类,分析学生 上网时间 和 上网时长 的模式。

实验过程:

• 使用算法: DBSCAN聚类算法

• 实现过程:

数据实例:

3.2 Python实现

from sklearn.cluster import DBSCAN

DBSCAN主要参数

(1)eps: 两个样本被看作邻居节点的最大距离

(2)min_samples: 簇的样本数

(3)metric:距离计算方式

例:sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=‘euclidean’)

#*=1. 建立工程,导入sklearn相关包=========**

import numpy as np

import sklearn.cluster as skc

from sklearn import metrics

from sklearn.cluster import DBSCAN

import matplotlib.pyplot as plt

#*=2. 读入数据并进行处理=====================**

mac2id = dict() #mac2id是一个字典:key是mac地址value是对应mac地址的上网时长以及开始上网时间

onlinetimes = [] #value:对应mac地址的上网时长以及开始上网时间

f = open(‘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]) #开始上网时间

if mac not in mac2id: #mac2id是一个字典:key是mac地址value是对应mac地址的上网时长以及开始上网时间

mac2id[mac] = len(onlinetimes)

onlinetimes.append((starttime, onlinetime))

else:

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

real_X = np.array(onlinetimes).reshape((-1, 2))

X = real_X[:, 0:1]

#*==3上网时间聚类,创建DBSCAN算法实例,并进行训练,获得标签=**

db = skc.DBSCAN(eps=0.01, min_samples=20).fit(X) # 调 用 DBSCAN 方 法 进 行 训 练 ,labels为每个数据的簇标签

labels = db.labels_

#*=4. 输出标签,查看结果===============================**

print(‘Labels:’) #打印数据被记上的标签,计算标签为-1,即噪声数据的比例。

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))

for i in range(n_clusters_): #打印各簇标号以及各簇内数据

print('Cluster ', i, ‘:’)

print(list(X[labels == i].flatten()))

#*5.画直方图,分析实验结果==============================**

plt.hist(X, 24)

plt.show()

3.3 结果

 

 转换直方图分析

 观察:上网时间大多聚集在22:00和23:00

3.4 拓展

数据分布 vs 聚类:

3-1. 上网时间聚类,创建DBSCAN算法实例,并进行训练,获得标签(上面已经分析过了)

3-2. 上网时长聚类,创建DBSCAN算法实例,并进行训练,获得标签:

结果:

Label表示样本的类别,-1表示DBSCAN划分为噪声。

(1)按照上网时长DBSCAN聚了5类,右图所示,显示了每个聚类的样本数量、聚

类的均值、标准差。

(2)时长聚类效果不如时间的聚类效果明显。

4 案例2(Python实现)


4.1 代码

from sklearn.datasets import make_blobs:聚类数据生成器

import numpy as np

import matplotlib.pyplot as plt

from sklearn import datasets

from sklearn.cluster import DBSCAN

#matplotlib inline

X1, y1=datasets.make_circles(n_samples=5000, factor=.6,

noise=.05)

X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]],

random_state=9)

X = np.concatenate((X1, X2)) #矩阵合并

#展示样本数据分布

plt.scatter(X[:, 0], X[:, 1], marker=‘o’)

plt.show()

#eps和min_samples 需要进行调参

y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)

#分类结果

plt.scatter(X[:, 0], X[:, 1], c=y_pred)

plt.show()

4.2 结果

h2       

5 案例3(Python原码实现)


5.1 代码

python中的zip()函数详解函数详解")

python中的map函数

#*导入相关库=========**

import numpy as np

import numpy.random as random

from numpy.core.fromnumeric import * #查看矩阵或者数组的维数

import matplotlib.pyplot as plt

#*计算两个向量之间的欧式距离**

def calDist(X1 , X2 ):

sum = 0

for x1 , x2 in zip(X1 , X2): #转换成浮点型

sum += (x1 - x2) ** 2

return sum ** 0.5

#*获取一个点的ε-邻域(记录的是索引)===**

def getNeibor(data , dataSet , e):

res = []

for i in range(shape(dataSet)[0]):

if calDist(data , dataSet[i])<e:

res.append(i)

return res

#*=密度聚类算法=====================**

def DBSCAN(dataSet , e , minPts):

coreObjs = {}#初始化核心对象集合

C = {}

n = shape(dataSet)[0]

#找出所有核心对象,key是核心对象的index,value是ε-邻域中对象的index

for i in range(n):

neibor = getNeibor(dataSet[i] , dataSet , e)

if len(neibor)>=minPts:

coreObjs[i] = neibor

oldCoreObjs = coreObjs.copy()

k = 0#初始化聚类簇数

notAccess = list(range(n))#初始化未访问样本集合(索引)

while len(coreObjs)>0:

OldNotAccess = []

OldNotAccess.extend(notAccess)

cores = coreObjs.keys()

#随机选取一个核心对象

randNum = random.randint(0,len(cores))

cores=list(cores)

core = cores[randNum]

queue = []

queue.append(core)

notAccess.remove(core)

while len(queue)>0:

q = queue[0]

del queue[0]

if q in oldCoreObjs.keys() :

delte = [val for val in oldCoreObjs[q] if val in notAccess]#Δ = N(q)∩Γ

queue.extend(delte)#将Δ中的样本加入队列Q

notAccess = [val for val in notAccess if val not in delte]#Γ = Γ\Δ

k += 1

C[k] = [val for val in OldNotAccess if val not in notAccess]

for x in C[k]:

if x in coreObjs.keys():

del coreObjs[x]

return C

#*=预处理数据================**

做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。

别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。


(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

(4)200多本电子书

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。

基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。

(5)Python知识点汇总

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。

在这里插入图片描述

(6)其他资料

还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。

在这里插入图片描述

这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值