【网络入侵检测】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 目标主机不同的连接所占的百分比

实验流程:

  1. 导入数据表(√)
  2. 三种在没有真实标签下的聚类评价指标(√)
  3. sklearn中k-means方法聚类分析(设置聚类数为3,4)(√)
  4. sklearn中层次聚类法(最大距离,最小距离)(√)
  5. scipy库k-means方法(√)
  6. scipy库层次聚类(√)
  7. 手写k均值(√)
  8. 手写层次聚类法(√)
  9. 了解特征的含义及作用(×)

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. 综述类_网络入侵检测技术综述

    文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...

  2. 网络入侵检测 Network Intrusion Detection System (NIDS)

    网络入侵检测 Network Intrusion Detection System--NIDS 网络入侵检测 Network Intrusion Detection System (NIDS) 1.学 ...

  3. java分类Kdd99数据集_KDD-CUP99 网络入侵检测数据集的处理与研究

    对于入侵检测的研究,需要大量有效的实验数据.数据可以通过抓包工具来采集,如Unix下的Tcpdump,Windows下的libdump,或者专用的软件snort捕捉数据包,生成连接记录作为数据源.本文 ...

  4. 文献笔记02 网络入侵检测技术综述(信息安全学报)

    文章目录 网络入侵检测技术综述 大纲 一.入侵检测系统分类 1.基于数据来源划分 2.基于检测技术划分 二.基于传统机器学习的入侵检测 1.入侵数据处理 2.监督机器学习技术 3.无监督机器学习技术 ...

  5. 网络入侵检测规避工具fragrouter

    网络入侵检测规避工具fragrouter 网络入侵检测系统可以通过拦截数据包,获取内容进而判断是否为恶意数据包.对于传输较大的数据包,通常会采用分片的方式,将大数据包拆分为小数据包进行传输.如果入侵检 ...

  6. Libnids库-网络入侵检测的基础框架

    1.Libnids介绍: Libnids(library  network intrusion detection system)是网络入侵检测开发的专业编程接口,实现了网络入侵检测系统的基本框架,提 ...

  7. libnet、libnids、libpcap轻松搭建Linux网络入侵检测系统

    利用三个源码包libnet.libnids.libpcap轻松搭建Linux网络入侵检测系统 如果要搭建基于Linux的网络入侵检测系统,必须要安装libnet.libnids.libpcap这三个源 ...

  8. 网络安全实验-入侵检测-基于网络入侵检测系统

     实验目的: 1.掌握snort IDS工作机理 2.应用snort三种方式工作 3.熟练编写snort规则 实验原理: 一.snort IDS概述 snort IDS(入侵检测系统)是一个强大的网络 ...

  9. 网络入侵检测--Snort软件配置文件snort.conf详解

    Snort最重要的工作模式就是NIDS,网络入侵检测,在NIDS模式下,snort.conf文件是必不可少的. 那么今天,我们来仔细阅读以下snort.conf这个文件,看一下每个部分的功能,都是配置 ...

  10. 数据驱动的网络入侵检测:最新动向与研究趋势

    数据驱动的网络入侵:最新趋势 最近动态 未来趋势 结论 最近动态 图9展示了2010 - 2020年数据驱动NID方法的研究兴趣趋势. 通过研究过去十年关于NID的文献,可以发现自2010年以来,人们 ...

最新文章

  1. iOS Named colors do not work prior to iOS 11.0问题解决
  2. JS基础-Array对象手册
  3. VTK:PolyData之ThresholdCells
  4. [C/C++面试题]-错题笔记与解析
  5. Windows Phone 7 系统主题颜色RGB和Hex值
  6. AutoLISP绘制圆DCL对话框
  7. mysql手工注入imformation_mysql 简单手工注入
  8. 全向轮机器人运动模型及应用分析(图片版)
  9. android tabhost 跳转,TabHost中跳转到指定Tab页问题
  10. Entity Framework连接Mysql数据库并生成Model和DAL层
  11. PTA顺序表基本操作
  12. JSONP跨域请求原理解析
  13. c语言打开文件并输出,文件的读取,c语言打开文件并输出
  14. JAVA版数字转人民币大写-四位数分隔法
  15. 语义网络 语义网 词汇链 知识图谱辨析
  16. Pentest WiKi Part1 信息收集
  17. 百度地图 | 定位到大西洋的几内亚湾的解决方法
  18. 关于三次握手与四次挥手的超详细解释
  19. 01:入门篇 - 初识 CTK
  20. 使用pip install安装自定义工具包(PyPI平台)

热门文章

  1. php v9搜索不到内容,關於如何解決PHPCMS V9內容搜索顯示不全問題解決方案
  2. 24、List三个子类的特点
  3. gcc/g++ 如何支持c11/c++11标准编译
  4. Linux下出现command not found的解决办法
  5. spring framework核心框架体系结构
  6. linux套接字连接外网,在Linux中的使用ss命令检查套接字 网络连接
  7. 创建data文件_剑指信奥 | C++ 之文件操作
  8. OpenCV-图像处理(03、Mat对象)
  9. java nextline_使用新一代Java
  10. php指令,php命令行下的常用命令