Kmeans聚类①——数据标准化&归一化&正则化

本文介绍了数据预处理中的Z-score标准化、最大最小归一化和正则化方法,以及它们在机器学习中的作用。讨论了如何使用sklearn库进行操作,并在实战中展示了不同归一化方法对数据分布的影响。通过比较,确定了log10归一化在特定场景下的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料

数据分析目录:
一、Excel系列——四大常用函数及十大高级图表
二、SQL系列——性能优化/多表关联/窗口分析函数等
三、统计学系列——概率论/置信区间/相关/抽样等
四、Pandas系列——数据读取/清洗/规整/分析实战等
五、Python做图系列——箱型图/散点图/回归图/热力图等
六、业务积累系列——流水预测/精细化运营/排序算法等
七、Kmeans系列——原理/评价指标/RFM实战等
八、决策树系列——算法原理/调参/python实现/项目实战
九、贝叶斯系列——算法原理/3种模型/文本分类实战
十、神经网络系列——BP算法原理/最小二乘法/项目实战

在进行机器学习之前,经常需要对训练数据进行标准化/归一化/正则化,为什么呢?(**文末有大礼赠送**

1、去除量纲的影响,将有量纲的数值变成无量纲的纯数值;
2、解决各特征之间数值差异过大的问题,比如一个向量(uv:10000, rate:0.03,money: 20),如果要与其它向量一起计算欧氏距离或者余弦相似度时,会向uv倾斜非常严重,导致其余2个特征对模型的贡献度非常低
3、提升训练的速度,防止过拟合

一、Z-score标准化

公众号: 数据小斑马,关注即可获得价值1000元的数据分析学习资料

Z-score标准化是将数据变成均值为0,标准差为1的分布,此方法比较适合于本身较符合正太分布的数据集。有2种方法,1是基于python本身函数计算,如下:

import pandas as pd
data = pd.read_csv('chat.csv',encoding='gbk')
df = data.values
x = df[:,:4]
print(x[:3])

在这里插入图片描述
通过调用x.mean和x.std(),可以看到均值为0,标准差为1

x = (x-x.mean())/x.std()
print(x.mean(),x.std())
print(x[:3])

在这里插入图片描述
另1种是直接调用sklearn库

from sklearn import preprocessing
t= preprocessing.StandardScaler().fit
<think>嗯,用户想了解如何用K-means聚类算法简单实现WAF日志的分析。首先,我需要回忆下K-means的基本原理和步骤。K-means是种无监督学习算法,通过迭代将数据分成K个簇,每个簇的中心由簇内点的平均值确定。那应用到WAF日志上,应该怎么做呢? 接下来,用户可能对WAF日志的结构不太清楚,可能需要先解释下日志的常见字段,比如时间戳、源IP、请求方法、URL、状态码、User-Agent等。这些信息中哪些对聚类有用呢?可能需要特征工程,把文本数据转化为数值向量。比如,使用TF-IDF处理URL中的路径参数,或者对HTTP方法进行编码。 然后,用户提到“简单实现”,所以步骤不能太复杂。可能需要分步骤说明:数据预处理、特征提取、应用K-means、结果分析。每个步骤需要具体说明怎么做。比如,预处理要清洗数据,处理缺失值,标准化归一化。特征提取可能需要将文本转为数值,比如用词袋模型或者TF-IDF。 不过,WAF日志里可能有大量分类变量,比如状态码、HTTP方法,这些可能需要独热编码。而URL路径可能需要分词处理,提取关键部分。比如,把路径中的数字替换为占位符,或者分割成不同的部分。比如,/user/123/profile转为/user/num/profile,这样能减少维度,避免过高的稀疏性。 然后是应用K-means。需要确定K值,可能需要手肘法或者轮廓系数。不过用户要简单实现的话,可能直接指定个K值,比如分成5类。然后需要解释如何训练模型,计算簇中心,分配样本。 结果分析部分,可能需要可视化,比如用PCA降维后画散点图,不同簇用不同颜色。然后分析每个簇的特征,比如哪些特征在簇中比较突出,可能对应攻击类型,比如SQL注入、XSS等。 不过用户可能没有提到具体工具,可能需要用Python的sklearn库,比如用KMeans类,以及TfidfVectorizer处理文本。可能需要给出示例代码的大致步骤,比如读取数据,处理特征,训练模型,评估。 还需要注意的问题:特征选择是否合适,高维稀疏数据可能影响K-means效果,可能需要降维处理,比如用TruncatedSVD。另外,K-means对初始中心敏感,可能需要多次初始化,或者用K-means++。 可能用户的实际需求是希望通过聚类发现潜在的攻击模式,所以需要解释如何根据聚类结果识别异常请求。比如,某个簇中的请求URL包含大量特殊字符或SQL关键词,可能是SQL注入尝试。 总结下来,回答的结构应该是步骤分解,每个步骤的关键点,注意事项,可能的代码示例(伪代码或库的使用),以及结果分析的方法。同时要提醒用户预处理的重要性,特征工程的方法,以及K-means的局限性,比如需要预先设定K,对噪声敏感等。</think>Kmeans聚类算法对WAF日志分析的简单实现可分为以下步骤: --- ### 数据预处理 1. **字段提取** 从WAF日志中提取关键字段,如: - 请求方法(GET/POST) - URL路径(如`/api/login`) - 状态码(200/403/500) - 请求参数(如`?id=1 UNION SELECT`) - User-Agent - 请求耗时 2. **文本向量化** - 对分类变量(如状态码)使用独热编码 示例:`403 -> [0,0,1]`(假设状态码分为200/500/403) - 对URL路径和参数使用TF-IDF向量化 示例:将`/api/login?id=1`转化为数值向量 3. **标准化处理** 使用`StandardScaler`对数值型特征(如请求耗时)归一化 --- ### 二、Kmeans算法应用 1. **核心公式** 目标是最小化簇内平方和: $$ J = \sum_{i=1}^k \sum_{x \in C_i} ||x - \mu_i||^2 $$ 其中$C_i$为第$i$个簇,$\mu_i$为簇中心 2. **代码示例(Python)** ```python from sklearn.cluster import KMeans from sklearn.feature_extraction.text import TfidfVectorizer # 假设logs是预处理后的文本列表 vectorizer = TfidfVectorizer(max_features=1000) X = vectorizer.fit_transform(logs) # 设置聚类数(需根据实际调整) kmeans = KMeans(n_clusters=5, random_state=42) kmeans.fit(X) labels = kmeans.labels_ ``` --- ### 三、结果分析 1. **手肘法选K值** 绘制不同K值的SSE曲线,选择拐点: ![手肘法示意图](https://miro.medium.com/v2/resize:fit:1400/1*9Alf8NrAzw2hJY2qhh0pEg.png) 2. **典型簇解读** - **正常请求簇**:短耗时、常见URL路径 - **异常请求簇**:高频非常规参数(如`UNION`、`<script>`) - **扫描攻击簇**:状态码集中为403,User-Agent异常 --- ### 四、优化方向 1. **特征增强** - 添加请求参数长度、特殊字符比例等衍生特征 - 对User-Agent做正则匹配分类(如`Scanner/Bot`标签) 2. **后处理** - 通过轮廓系数验证聚类质量 $$ s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} $$ - 对异常簇进行人工复核标记 --- ### 五、注意事项 1. **局限性** - Kmeans对初始中心敏感,建议多次运行取最优解 - 高维稀疏数据(如TF-IDF矩阵)需配合降维(PCA/t-SNE) 2. **扩展方案** - 结合时序分析(如突发集群请求检测) - 与DBSCAN结合处理噪声点 通过上述流程,可快速定位WAF日志中的潜在攻击模式(如SQL注入、目录遍历),实际部署时建议配合规则引擎进行二次验证。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值