聚类算法评价指标——基于DBI指数的k-means算法(python代码)

参考文章:
https://blog.youkuaiyun.com/a841454735/article/details/80237257
http://blog.sina.com.cn/s/blog_65c8baf901016flh.html

1 DBI指数介绍

Davies-Bouldin指数(DBI)(戴维森堡丁指数),又称为分类适确性指标,是由大卫L·Davies和唐纳德·Bouldin提出的一种评估聚类算法优劣的指标。

属于内部指标,内部指标是利用数据集的固有特征和量值来评价一个聚类算法的结果。

2 优点

基于DBI指数的k-means算法无需指定K的值,而是给出K的范围,由算法自动确定最适合的K值。

3 定义值

3.1 S i S_i Si:表示第i类中,数据点的分散程度

S i = { 1 T i ∑ j = 1 T i ∣ X j − A i ∣ q } 1 q S_i=\{\frac{1}{T_i}\sum_{j=1}^{T_i}|X_j-A_i|^q\}^{\frac{1}{q}} Si={Ti1j=1TiXjAiq}q1

X j X_j Xj:第i类中第j个数据点
A i A_i Ai:第i类的中心数据点

当q=1:表示各点到中心距离的均值
当q=2:表示各点到中心距离的标准差
【用来衡量离散程度】

3.2 M i j M_{ij} Mij:表示第i类与第j类的距离

M i j = ∑ k = 1 N ∣ a k i − a k j ∣ p } 1 p M_{ij}=\sum_{k=1}^{N}|a_{ki}-a_{kj}|^p\}^{\frac{1}{p}} Mij=k=1Nakiakjp}p1

a k i a_{ki} aki:表示第i类的中心点的第k个属性的值

当p=1:表示各点到中心距离的均值
当p=2:表示各点到中心距离的标准差
【用来衡量离散程度】

3.3 R i j R_{ij} Rij:表示第i类和第j类的相似度

R i j = S i + S j M i j R_{ij}=\frac{S_i+S_j}{M_{ij}} Rij=MijSi+Sj

3.4 R ‾ \overline{R} R:DBI指数,越小分类效果越好

  1. 先计算 R i R_i Ri,i=1,2,3…N
    即求类i与其他类的最大相似值。

R i = m a x ( R i 1 , R i 2 , . . . R i j , . . . R i N ) , i ≠ j R_i=max(R_{i1},R_{i2}, ...R_{ij}, ...R_{iN}) ,i≠j Ri=max(Ri1,Ri2,...Rij,...RiN)i=j

  1. 再计算每个类的最大相似度的均值,得到 R ‾ \overline{R} R,即DBI指数。
    D B I = R ‾ = 1 N ∑ i = 1 N R i DBI =\overline{R}=\frac{1}{N}\sum_{i=1}^{N}R_i DBI=R=N1i=1NRi

分类个数的不同(N不同),会导致 R ‾ \overline{R} R不同, R ‾ \overline{R} R值越小,分类效果越好。

4 这篇博文公式挺多挺费事的,觉得有用的话可以点击收藏关注~~点赞是我更新的无限动力!!

5 python代码实现

  • 代码来自参考博文里面的博主写的~
def vectorDistance(v1, v2):
    """
    this function calculates de euclidean distance between two
    vectors.
    """
    sum = 0
    for i in range(len(v1)):
        sum += (v1[i] - v2[i]) ** 2
    return sum ** 0.5


def compute_Si(i, x, clusters, nc):
    norm_c = nc
    s = 0
    for t in x[i]:
        s += vectorDistance(t, clusters)
    return s / norm_c


def compute_Rij(i, j, x, clusters, nc):
    Mij = vectorDistance(clusters[i], clusters[j])
    Rij = (compute_Si(i, x, clusters[i], nc) + compute_Si(j, x, clusters[j], nc)) / Mij
    return Rij


def compute_Di(i, x, clusters, nc):
    list_r = []
    for j in range(nc):
        if i != j:
            temp = compute_Rij(i, j, x, clusters, nc)
            list_r.append(temp)
    return max(list_r)


def compute_DB_index(x, clusters, nc):
    sigma_R = 0.0
    for i in range(nc):
        sigma_R = sigma_R + compute_Di(i, x, clusters, nc)
    DB_index = float(sigma_R) / float(nc)
    return DB_index
### 使用 K-means 算法进行网络入侵检测的应用及实现 K-means 是一种常用的无监督学习算法,在网络入侵检测中可以通过聚类的方式识别正常流量和异常流量的行为特征。以下是关于其在网络入侵检测中的具体应用及其实现方法: #### 1. 数据预处理 在实际场景中,原始网络流量数据通常包含大量噪声和冗余信息。为了使 K-means 更加高效地工作,需要对数据进行清洗、标准化以及降维操作。 - **数据清洗**:去除缺失值或错误的数据记录。 - **特征选择与提取**:选取能够反映网络流量特性的关键属性,例如包大小、传输时间间隔等[^3]。 - **归一化处理**:由于各维度量纲可能不一致,需通过 Min-Max 或 Z-score 方法将数值统一至同一范围[^2]。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data_scaled = scaler.fit_transform(data_raw) ``` --- #### 2. 利用 K-means 进行聚类 完成数据准备后,即可调用 `sklearn.cluster.KMeans` 实现 K-means 聚类模型训练过程。此阶段主要涉及参数设定(如簇数 k)、初始化中心点策略等内容。 - **确定最佳簇数量 (k)**:可通过肘部法则(elbow method)或者轮廓系数(silhouette score)辅助决策最优分组数目。 ```python import matplotlib.pyplot as plt from sklearn.cluster import KMeans wcss = [] for i in range(1, 10): kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42) kmeans.fit(data_scaled) wcss.append(kmeans.inertia_) plt.plot(range(1, 10), wcss) plt.title('Elbow Method') plt.xlabel('Number of clusters') plt.ylabel('WCSS') plt.show() ``` 一旦选定合适的 k 值,则正式构建并拟合最终版本的分类器实例对象。 ```python optimal_k = 3 # 根据上述图形判断得出的最佳簇数 final_model = KMeans(n_clusters=optimal_k, init='k-means++', max_iter=300, n_init=10, random_state=42) labels = final_model.fit_predict(data_scaled) centroids = final_model.cluster_centers_ ``` --- #### 3. 结果评估与解释 得到预测标签之后,进一步验证这些类别划分是否合理至关重要。一方面借助内部指标比如 Davies-Bouldin Index(DBI),另一方面也可以引入外部标准即已知真实标记来进行对比分析。 对于未知样本而言,如果某个新观测被分配到了少数群体里头去的话,那么它就很可能是潜在威胁所在之处;反之亦然——属于多数派则大概率为良性事件的一部分[^1]。 ```python from sklearn.metrics import silhouette_score score = silhouette_score(data_scaled, labels) print(f'Silhouette Score: {score}') ``` 此外还可以绘制散点图直观展示各个子集分布状况以便于理解整个系统的运作机制[^4]。 ```python import numpy as np import pandas as pd df_result = pd.DataFrame({'Cluster': labels}) grouped_data = df_result.groupby(['Cluster']).size() fig, ax = plt.subplots(figsize=(8,6)) unique_labels = set(labels) colors = ['red','green','blue'] for label in unique_labels: cluster_points = data_scaled[labels == label] ax.scatter(cluster_points[:,0],cluster_points[:,1],c=colors[label],label=f'Cluster {label}') ax.legend(loc="best", title="Clusters") plt.title('K-means Clustering Results on Network Traffic Data') plt.show() ``` --- ### 总结 综上所述,采用 K-means 对网络日志实施自动化监控是一种简单有效的手段,不过需要注意的是该方案仅适用于离线批量型任务场合,并且假设所有恶意活动都呈现出显著区别于常规通信模式的特点才行得通。因此建议将其作为补充工具而非唯一依赖途径加以运用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值