【网络入侵检测】K均值与层次聚类分析(sklearn,scipy,手写实现)
【网络入侵检测】K均值与层次聚类分析(sklearn,scipy,手写实现)
链接:https://pan.baidu.com/s/1jnRCF2xdsGvnWWBLl1uR6A
提取码:j1c0
数据集字段信息:
指标名称 | 含义 |
---|---|
Count | 在一个时间窗口内目标主机是与当前连接相同的连接次数 |
Serror | 出现错误的连接百分比 |
Same_srv | 目标端口相同的连接所占的百分比 |
Diff_srv | 目标端口不同的连接所占的百分比 |
Srv_count | 目标端口(Service)与当前连接相同的连接次数 |
Srv_Serror | 出现SYN错误的连接百分比 |
Srv_diff_host | 目标主机不同的连接所占的百分比 |
实验流程:
- 导入数据表(√)
- 三种在没有真实标签下的聚类评价指标(√)
- sklearn中k-means方法聚类分析(设置聚类数为3,4)(√)
- sklearn中层次聚类法(最大距离,最小距离)(√)
- scipy库k-means方法(√)
- scipy库层次聚类(√)
- 手写k均值(√)
- 手写层次聚类法(√)
- 了解特征的含义及作用(×)
1. 导入数据表
# 导包
import pandas as pd
# 读取xls文件
data = pd.read_excel('模式识别大实验2_网络入侵样本数据 .xls')
print(data.head())
Count Serror Same_srv Diff_srv Srv_count Srv_serror Srv_diff_host
0 1 0.10 1.00 0.00 5 0.0 0.6
1 1 0.00 1.00 0.00 4 0.0 0.5
2 15 0.88 0.88 0.12 25 0.5 0.0
3 6 0.75 0.30 1.00 6 0.0 0.0
4 8 0.95 0.25 0.75 7 0.6 0.3
2. 三种在没有真实标签下的聚类评价指标
from sklearn.cluster import KMeans
import sklearn.metrics as sm
import numpy as np
from sklearn.decomposition import PCA
# from sklearn.manifold import TSNE
# 聚类效果评价分析(未知真实标签)
data = np.array(data)
pca = PCA().fit_transform(data) # 降维,偏于绘图显示数据
columns = ['轮廓系数', 'CH分数', 'DBI']
def cluster_judge(data, label, k):# 轮廓系数:当 clusters (簇)密集且分离较好时,分数更高# CH index的数值越大越好# DBI的值最小是0,值越小,代表聚类效果越好l = len(k)values = np.empty([l, 3])for i in range(l):values[i] = np.array([sm.silhouette_score(data, label[i], sample_size=data.shape[0], metric='euclidean'), sm.calinski_harabasz_score(data, label[i]), sm.davies_bouldin_score(data, label[i])])return pd.DataFrame(values, index=k, columns=columns)
3. sklearn中k-means方法聚类分析
# 聚类分析
def sklearn_k_means(data, k):length = len(k)label = np.empty([length, data.shape[0]])for i in range(length):clf = KMeans(n_clusters=k[i]) # k = [3, 4]clf.fit(data)pred_y = clf.predict(data)label[i] = pred_yreturn label, k
label_sklearn_k_means, k = sklearn_k_means(data, [3, 4])
cluster_judge(data, label_sklearn_k_means, k)
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
3 | 0.701972 | 195.167370 | 0.247188 |
4 | 0.580670 | 256.170016 | 0.371496 |
结论
:
sklearn中的k-means方法中,若只考虑CH分数,选取簇数为4时,聚类效果最好;但是结合图像以及轮廓系数、DBI,可以看到,选取簇数为3时,聚类效果最好。
# 聚类结果可视化
import matplotlib.pyplot as plt
def clusterPlot(pca, label, k, typ):sub_y = label.shape[0]# tsne = TSNE(n_components=2, learning_rate=100).fit_transform(data)for j in range(sub_y):plt.scatter(pca[:,0], pca[:,1], c=label[j])# plt.plt.scatter(tsne[:,0], tsne[:,1], c=label[j])if typ == 'clusters':plt.title(('clusters = ', k[j]))elif typ == 'method':plt.title(('method = ', k[j]))plt.show()
clusterPlot(pca, label_sklearn_k_means, k, 'clusters')
4. sklearn中层次聚类法
# 导包
from sklearn.cluster import AgglomerativeClustering
# 聚类分析
def sklearn_hierarchical_clustering(data, method):length = len(method)label = np.empty([length, data.shape[0]])for i in range(length):clf = AgglomerativeClustering(linkage=method[i], n_clusters=4)clf.fit(data)pred_y = clf.fit_predict(data)label[i] = pred_yreturn label, method
label_sklearn_hierarchical_clustering, method = sklearn_hierarchical_clustering(data, ['ward', 'complete'])
cluster_judge(data, label_sklearn_hierarchical_clustering, method)
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
ward | 0.534248 | 247.849321 | 0.458779 |
complete | 0.534248 | 247.849321 | 0.458779 |
结论
:
结合轮廓系数、CH分数与DBI的值以及图像可知,最大距离与最小距离聚类效果相差不大。
# 聚类结果可视化
clusterPlot(pca, label_sklearn_hierarchical_clustering, method, 'method')
5. scipy库k-means方法
# 导包
from scipy.cluster.vq import kmeans, vq, whiten
# 白化数据
data_scipy = whiten(data)
# 聚类分析
def scipy_k_means(data, k):length = len(k)label = np.empty([length, data.shape[0]])for i in range(length):centroids, _ = kmeans(data, k[i]) # k = [3, 4]clx, dist = vq(data, centroids)label[i] = clxreturn label, k
label_scipy_k_means, k = scipy_k_means(data_scipy, [3, 4])
cluster_judge(data_scipy, label_scipy_k_means, k)
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
3 | 0.435099 | 14.819891 | 0.773639 |
4 | 0.481701 | 27.369191 | 0.564734 |
结论
:
结合轮廓系数、CH分数与DBI的值以及图像可知,选取簇数为4时,聚类效果最好。
pca_scipy = PCA().fit_transform(data_scipy)
clusterPlot(pca_scipy, label_scipy_k_means, k, 'clusters')
6. scipy库层次聚类
# 导包
import scipy.cluster.hierarchy as hcluster
# 聚类分析
def scipy_hierarchical_clustering(data, method):length = len(method)label = np.empty([length, data.shape[0]])for i in range(length):# 生成点与点之间的距离矩阵,这里用的欧氏距离:disMat = hcluster.distance.pdist(data, 'euclidean') # 进行层次聚类:Z = hcluster.linkage(disMat, method=method[i]) cluster = hcluster.fcluster(Z, 4, 'maxclust')# 将层级聚类结果以树状图表示出来P = hcluster.dendrogram(Z)plt.show()label[i] = clusterreturn label, method
label_scipy_hierarchical_clustering, method = scipy_hierarchical_clustering(data, ['single', 'complete'])
cluster_judge(data, label_scipy_hierarchical_clustering, method)
single
:
complete
:
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
single | 0.587266 | 141.265620 | 0.404186 |
complete | 0.534248 | 247.849321 | 0.458779 |
结论
:
结合轮廓系数、CH分数与DBI的值以及图像可知,最大距离与最小距离聚类效果相差不大。
clusterPlot(pca, label_scipy_hierarchical_clustering, method, 'method')
7. 手写k均值
# 计算欧几里得距离
def distEclud(vecA, vecB):return np.sqrt(np.sum(np.power(vecA - vecB, 2))) # 求两个向量之间的距离# 构建聚簇中心,取k个(此例中为4)随机质心
def randCent(data, k):n = data.shape[1]centroids = np.mat(np.zeros([k, n])) # 每个质心有n个坐标值,总共要k个质心for j in range(n):minJ = min(data[:,j])maxJ = max(data[:,j])rangeJ = float(maxJ - minJ)c = [i / k for i in range(k)]centroids[:,j] = minJ + rangeJ * np.array(c).reshape(-1,1)return centroids# k-means 聚类算法
def diy_k_means(data, k, distMeans = distEclud, createCent = randCent):m = data.shape[0]length = len(k)label = np.empty([length, m])for o in range(length):clusterAssment = np.mat(np.zeros((m, 2))) # 用于存放该样本属于哪类及质心距离# clusterAssment第一列存放该数据所属的中心点,第二列是该数据到中心点的距离centroids = createCent(data, k[o])clusterChanged = True # 用来判断聚类是否已经收敛while clusterChanged:clusterChanged = False;for i in range(m): # 把每一个数据点划分到离它最近的中心点minDist = np.inf; minIndex = -1;for j in range(k[o]):distJI = distMeans(centroids[j,:], data[i,:])if distJI < minDist:minDist = distJIminIndex = j # 如果第i个数据点到第j个中心点更近,则将i归属为jif clusterAssment[i, 0] != minIndex: clusterChanged = True; # 如果分配发生变化,则需要继续迭代clusterAssment[i,:] = minIndex, minDist**2 # 并将第i个数据点的分配情况存入字典for cent in range(k[o]): # 重新计算中心点t = np.nonzero(clusterAssment[:,0].A == cent)[0]ptsInClust = data[t] # 去第一列等于cent的所有列if len(t) != 0:centroids[cent,:] = np.mean(ptsInClust, axis = 0) # 算出这些数据的中心点pred_y = clusterAssment[:,0].reshape(1,-1)label[o] = pred_yreturn label, k
label_diy_k_means, k = diy_k_means(data, [3, 4])
cluster_judge(data, label_diy_k_means, k)
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
3 | 0.701972 | 195.16737 | 0.247188 |
4 | 0.701972 | 195.16737 | 0.247188 |
结论
:
三种评价标准值相等,选取簇数为3或4,聚类效果一样。
clusterPlot(pca, label_diy_k_means, k, 'clusters')
8. 手写层次聚类(以簇数为4为例)
# 最小距离
def dist_min(Ci, Cj):return np.min([distEclud(i, j) for i in Ci for j in Cj])# 最大距离
def dist_max(Ci, Cj):return np.max([distEclud(i, j) for i in Ci for j in Cj])# 平均距离
def dist_avg(Ci, Cj):return np.sum([distEclud(i, j) for i in Ci for j in Cj]) / (len(Ci) * len(Cj))# 找到距离最小的下标
def find_Min(M):min = 100000x = 0; y = 0for i in range(len(M)):for j in range(len(M[i])):if i != j and M[i][j] < min:min = M[i][j];x = i; y = jreturn (x, y, min)# 簇数转标签
def C2labels(data, C):label = np.empty([1, data.shape[0]])for i in range(len(C)):for j in range(len(C[i])):for k in range(data.shape[0]):if all(C[i][j] == data[k]):label[0][k] = ireturn label#算法模型:
def diy_hierarchical_clustering(data, method):length = len(method)label = np.empty([length, data.shape[0]])for o in range(length):# 初始化 C 和 Mdist = eval(method[o])C = []M = []for i in data:Ci = []Ci.append(i)C.append(Ci)for i in C:Mi = []for j in C:Mi.append(dist(i, j))M.append(Mi)q = len(data)# 合并更新while q > 4:x, y, min = find_Min(M)C[x].extend(C[y])del(C[y])M = []for i in C:Mi = []for j in C:Mi.append(dist(i, j))M.append(Mi)q -= 1label[o] = C2labels(data, C)return label, method
label_diy_hierarchical_clustering, method = diy_hierarchical_clustering(data, ['dist_min', 'dist_avg', 'dist_max'])
cluster_judge(data, label_diy_hierarchical_clustering, method)
轮廓系数 | CH分数 | DBI | |
---|---|---|---|
dist_min | 0.587266 | 141.265620 | 0.404186 |
dist_avg | 0.565766 | 217.638865 | 0.337218 |
dist_max | 0.534248 | 247.849321 | 0.458779 |
结论
:
三种方法聚类效果几乎一致
clusterPlot(pca, label_diy_hierarchical_clustering, method, 'method')
【网络入侵检测】K均值与层次聚类分析(sklearn,scipy,手写实现)相关推荐
- 综述类_网络入侵检测技术综述
文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...
- 网络入侵检测 Network Intrusion Detection System (NIDS)
网络入侵检测 Network Intrusion Detection System--NIDS 网络入侵检测 Network Intrusion Detection System (NIDS) 1.学 ...
- java分类Kdd99数据集_KDD-CUP99 网络入侵检测数据集的处理与研究
对于入侵检测的研究,需要大量有效的实验数据.数据可以通过抓包工具来采集,如Unix下的Tcpdump,Windows下的libdump,或者专用的软件snort捕捉数据包,生成连接记录作为数据源.本文 ...
- 文献笔记02 网络入侵检测技术综述(信息安全学报)
文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...
- 网络入侵检测规避工具fragrouter
网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包.对于传输较大的数据包,通常会采用分片的方式,将大数据包拆分为小数据包进行传输.如果入侵检 ...
- Libnids库-网络入侵检测的基础框架
1.Libnids介绍: Libnids(library network intrusion detection system)是网络入侵检测开发的专业编程接口,实现了网络入侵检测系统的基本框架,提 ...
- libnet、libnids、libpcap轻松搭建Linux网络入侵检测系统
利用三个源码包libnet.libnids.libpcap轻松搭建Linux网络入侵检测系统 如果要搭建基于Linux的网络入侵检测系统,必须要安装libnet.libnids.libpcap这三个源 ...
- 网络安全实验-入侵检测-基于网络入侵检测系统
实验目的: 1.掌握snort IDS工作机理 2.应用snort三种方式工作 3.熟练编写snort规则 实验原理: 一.snort IDS概述 snort IDS(入侵检测系统)是一个强大的网络 ...
- 网络入侵检测--Snort软件配置文件snort.conf详解
Snort最重要的工作模式就是NIDS,网络入侵检测,在NIDS模式下,snort.conf文件是必不可少的. 那么今天,我们来仔细阅读以下snort.conf这个文件,看一下每个部分的功能,都是配置 ...
- 数据驱动的网络入侵检测:最新动向与研究趋势
数据驱动的网络入侵:最新趋势 最近动态 未来趋势 结论 最近动态 图9展示了2010 - 2020年数据驱动NID方法的研究兴趣趋势. 通过研究过去十年关于NID的文献,可以发现自2010年以来,人们 ...
最新文章
- iOS Named colors do not work prior to iOS 11.0问题解决
- JS基础-Array对象手册
- VTK:PolyData之ThresholdCells
- [C/C++面试题]-错题笔记与解析
- Windows Phone 7 系统主题颜色RGB和Hex值
- AutoLISP绘制圆DCL对话框
- mysql手工注入imformation_mysql 简单手工注入
- 全向轮机器人运动模型及应用分析(图片版)
- android tabhost 跳转,TabHost中跳转到指定Tab页问题
- Entity Framework连接Mysql数据库并生成Model和DAL层
- PTA顺序表基本操作
- JSONP跨域请求原理解析
- c语言打开文件并输出,文件的读取,c语言打开文件并输出
- JAVA版数字转人民币大写-四位数分隔法
- 语义网络 语义网 词汇链 知识图谱辨析
- Pentest WiKi Part1 信息收集
- 百度地图 | 定位到大西洋的几内亚湾的解决方法
- 关于三次握手与四次挥手的超详细解释
- 01:入门篇 - 初识 CTK
- 使用pip install安装自定义工具包(PyPI平台)
热门文章
- php v9搜索不到内容,關於如何解決PHPCMS V9內容搜索顯示不全問題解決方案
- 24、List三个子类的特点
- gcc/g++ 如何支持c11/c++11标准编译
- Linux下出现command not found的解决办法
- spring framework核心框架体系结构
- linux套接字连接外网,在Linux中的使用ss命令检查套接字 网络连接
- 创建data文件_剑指信奥 | C++ 之文件操作
- OpenCV-图像处理(03、Mat对象)
- java nextline_使用新一代Java
- php指令,php命令行下的常用命令