import numpy as np
from matplotlib import pyplot as plt
import scapy.all as scapy
from collections import defaultdict
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd
# ======================
# 1. PCAP文件解析与流重组
# ======================
print("正在解析PCAP文件...")
packets = scapy.rdpcap('test.pcap')
# 按五元组重组网络流
flows = defaultdict(list)
for pkt in packets:
if 'IP' in pkt:
# 获取协议类型 (TCP=6, UDP=17, ICMP=1)
proto = pkt['IP'].proto
src_port = pkt[proto].sport if proto in pkt else 0
dst_port = pkt[proto].dport if proto in pkt else 0
# 创建流标识键 (源IP, 目的IP, 源端口, 目的端口, 协议)
flow_key = (pkt['IP'].src, pkt['IP'].dst, src_port, dst_port, proto)
flows[flow_key].append(pkt)
print(f"共识别出 {len(flows)} 个网络流")
# ======================
# 2. 特征工程
# ======================
print("正在提取流量特征...")
features = []
valid_flows = []
for flow_key, packets in flows.items():
# 跳过包含少于5个包的流
if len(packets) < 5:
continue
# 基础统计特征
packet_count = len(packets)
total_bytes = sum(len(p) for p in packets)
# 时序特征
timestamps = [float(p.time) for p in packets] # 关键修改:转换为float
iat = np.diff(timestamps) # 包间隔时间
mean_iat = np.mean(iat) if len(iat) > 0 else 0
std_iat = np.std(iat) if len(iat) > 1 else 0
# 包长特征
pkt_lengths = [len(p) for p in packets]
mean_pkt_len = np.mean(pkt_lengths)
std_pkt_len = np.std(pkt_lengths)
min_pkt_len = min(pkt_lengths)
max_pkt_len = max(pkt_lengths)
# 方向特征 (0=客户端到服务器, 1=服务器到客户端)
directions = [1 if p['IP'].src == flow_key[0] else 0 for p in packets]
up_ratio = sum(directions) / len(directions)
features.append([
packet_count,
total_bytes,
mean_iat,
std_iat,
mean_pkt_len,
std_pkt_len,
min_pkt_len,
max_pkt_len,
up_ratio
])
valid_flows.append(flow_key)
# 转换为特征矩阵
feature_matrix = np.array(features)
feature_names = [
'包数量', '总字节数', '平均包间隔', '包间隔标准差',
'平均包长', '包长标准差', '最小包长', '最大包长', '上行比例'
]
print(f"提取了 {len(features)} 个有效流的 {len(feature_names)} 维特征")
# ======================
# 3. 数据标准化
# ======================
print("正在进行数据标准化...")
scaler = StandardScaler()
scaled_features = scaler.fit_transform(feature_matrix)
# ======================
# 4. 肘部法则确定最佳K值
# ======================
print("使用肘部法则确定最佳聚类数...")
n_samples = scaled_features.shape[0] # 获取实际样本数
# 根据样本数量动态调整K范围
if n_samples < 5:
print(f"警告:样本数量较少({n_samples}),将使用简化聚类策略")
k_range = range(1, min(11, n_samples + 1)) # K值上限不超过样本数
else:
k_range = range(1, 11) # 测试1-10个聚类
sse = []
kmeans_models = {} # 存储每个K的模型
for k in k_range:
# 确保K值不超过样本数
if k > n_samples:
print(f"跳过K={k}(超过样本数{n_samples})")
continue
kmeans = KMeans(n_clusters=k, n_init=10, random_state=42)
kmeans.fit(scaled_features)
sse.append(kmeans.inertia_) # 获取SSE
kmeans_models[k] = kmeans # 存储模型
# 如果没有足够的点绘制肘部图,直接选择K值
if len(sse) < 2:
optimal_k = min(2, n_samples) # 至少2类,但不超过样本数
print(f"样本过少,直接设置K={optimal_k}")
else:
# 绘制肘部法则图
plt.figure(figsize=(10, 6))
plt.plot(list(k_range)[:len(sse)], sse, 'bo-')
plt.xlabel('聚类数量 $ K$')
plt.ylabel('SSE (误差平方和)')
plt.title('肘部法则确定最佳聚类数')
plt.grid(True)
plt.savefig('elbow_method.png', dpi=300)
plt.close()
print("肘部法则图已保存为 elbow_method.png")
# 自动检测拐点 (肘点)
if len(sse) >= 3: # 至少有3个点才能计算二阶差分
knee_point = np.argmin(np.diff(sse, 2)) + 2
optimal_k = max(2, min(10, knee_point)) # 确保在2-10之间
else:
# 样本较少时使用简单策略
optimal_k = max(2, min(3, n_samples)) # 选择2或3
print(f"自动检测的最佳聚类数: K = {optimal_k}")
# ======================
# 5. K-means聚类
# ======================
print(f"正在进行K-means聚类 (K={optimal_k})...")
# 如果样本数小于K,调整K值
if optimal_k > n_samples:
optimal_k = max(1, n_samples) # 确保K不超过样本数
print(f"调整聚类数为样本数: K = {optimal_k}")
# 使用之前存储的模型或创建新模型
if optimal_k in kmeans_models:
kmeans = kmeans_models[optimal_k]
cluster_labels = kmeans.labels_
else:
kmeans = KMeans(n_clusters=optimal_k, n_init=10, random_state=42)
cluster_labels = kmeans.fit_predict(scaled_features)
# 计算轮廓系数(仅当K>1时)
if optimal_k > 1:
silhouette_avg = silhouette_score(scaled_features, cluster_labels)
print(f"轮廓系数: {silhouette_avg:.4f} (接近1表示聚类效果良好)")
else:
print("聚类数为1,无需计算轮廓系数")
# ======================
# 6. 结果分析与可视化
# ======================
# 创建结果DataFrame
result_df = pd.DataFrame({
'源IP': [flow[0] for flow in valid_flows],
'目的IP': [flow[1] for flow in valid_flows],
'协议': [f"TCP(6)" if flow[4] == 6 else f"UDP(17)" for flow in valid_flows],
'聚类标签': cluster_labels
})
# 添加特征值到结果表
for i, name in enumerate(feature_names):
result_df[name] = feature_matrix[:, i]
# 保存聚类结果
result_df.to_csv('cluster_results.csv', index=False)
print("聚类结果已保存为 cluster_results.csv")
# 各簇统计信息
cluster_stats = result_df.groupby('聚类标签').agg({
'包数量': 'mean',
'总字节数': 'mean',
'平均包间隔': 'mean',
'上行比例': 'mean'
}).rename(columns={
'包数量': '平均包数量',
'总字节数': '平均总字节数',
'平均包间隔': '平均包间隔(s)',
'上行比例': '平均上行比例'
})
print("\n各用户簇流量特征统计:")
print(cluster_stats.round(2))
# 可视化聚类结果 (使用前两个主成分)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principal_components = pca.fit_transform(scaled_features)
plt.figure(figsize=(12, 8))
scatter = plt.scatter(
principal_components[:, 0],
principal_components[:, 1],
c=cluster_labels,
cmap='viridis',
alpha=0.6
)
# 添加簇中心
centers = pca.transform(kmeans.cluster_centers_)
plt.scatter(
centers[:, 0], centers[:, 1],
c='red', s=200, alpha=0.9, marker='X',
edgecolor='black'
)
plt.colorbar(scatter, label='用户簇')
plt.xlabel('主成分 1')
plt.ylabel('主成分 2')
plt.title(f'校园网用户流量聚类 (K={optimal_k})')
plt.grid(alpha=0.3)
plt.savefig('cluster_visualization.png', dpi=300)
plt.close()
print("聚类可视化图已保存为 cluster_visualization.png")
print("\n聚类完成! 结果文件已保存:")
print("- elbow_method.png: 肘部法则图")
print("- cluster_results.csv: 详细聚类结果")
print("- cluster_visualization.png: 聚类可视化")
编译结果如下,解释一下编译结果
E:\用户画像\聚类分离用户数据\.venv\Scripts\python.exe E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py
正在解析PCAP文件...
共识别出 3 个网络流
正在提取流量特征...
提取了 3 个有效流的 9 维特征
正在进行数据标准化...
使用肘部法则确定最佳聚类数...
警告:样本数量较少(3),将使用简化聚类策略
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 35823 (\N{CJK UNIFIED IDEOGRAPH-8BEF}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 24046 (\N{CJK UNIFIED IDEOGRAPH-5DEE}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 24179 (\N{CJK UNIFIED IDEOGRAPH-5E73}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 26041 (\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 21644 (\N{CJK UNIFIED IDEOGRAPH-548C}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 32920 (\N{CJK UNIFIED IDEOGRAPH-8098}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 37096 (\N{CJK UNIFIED IDEOGRAPH-90E8}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 27861 (\N{CJK UNIFIED IDEOGRAPH-6CD5}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 21017 (\N{CJK UNIFIED IDEOGRAPH-5219}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 30830 (\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 23450 (\N{CJK UNIFIED IDEOGRAPH-5B9A}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 26368 (\N{CJK UNIFIED IDEOGRAPH-6700}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 20339 (\N{CJK UNIFIED IDEOGRAPH-4F73}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 32858 (\N{CJK UNIFIED IDEOGRAPH-805A}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 31867 (\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:132: UserWarning: Glyph 25968 (\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.
plt.savefig('elbow_method.png', dpi=300)
Font 'default' does not have a glyph for '\u805a' [U+805a], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u7c7b' [U+7c7b], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u6570' [U+6570], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u91cf' [U+91cf], substituting with a dummy symbol.
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 35823 (\N{CJK UNIFIED IDEOGRAPH-8BEF}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 24046 (\N{CJK UNIFIED IDEOGRAPH-5DEE}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 24179 (\N{CJK UNIFIED IDEOGRAPH-5E73}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 26041 (\N{CJK UNIFIED IDEOGRAPH-65B9}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 21644 (\N{CJK UNIFIED IDEOGRAPH-548C}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 32920 (\N{CJK UNIFIED IDEOGRAPH-8098}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 37096 (\N{CJK UNIFIED IDEOGRAPH-90E8}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 27861 (\N{CJK UNIFIED IDEOGRAPH-6CD5}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 21017 (\N{CJK UNIFIED IDEOGRAPH-5219}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 30830 (\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 23450 (\N{CJK UNIFIED IDEOGRAPH-5B9A}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 26368 (\N{CJK UNIFIED IDEOGRAPH-6700}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 20339 (\N{CJK UNIFIED IDEOGRAPH-4F73}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 32858 (\N{CJK UNIFIED IDEOGRAPH-805A}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 31867 (\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 25968 (\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
Font 'default' does not have a glyph for '\u805a' [U+805a], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u7c7b' [U+7c7b], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u6570' [U+6570], substituting with a dummy symbol.
Font 'default' does not have a glyph for '\u91cf' [U+91cf], substituting with a dummy symbol.
肘部法则图已保存为 elbow_method.png
自动检测的最佳聚类数: K = 2
正在进行K-means聚类 (K=2)...
轮廓系数: 0.1744 (接近1表示聚类效果良好)
聚类结果已保存为 cluster_results.csv
各用户簇流量特征统计:
平均包数量 平均总字节数 平均包间隔(s) 平均上行比例
聚类标签
0 10.5 3721.0 0.04 1.0
1 6.0 1023.0 0.16 1.0
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 20027 (\N{CJK UNIFIED IDEOGRAPH-4E3B}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 25104 (\N{CJK UNIFIED IDEOGRAPH-6210}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 20998 (\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 26657 (\N{CJK UNIFIED IDEOGRAPH-6821}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 22253 (\N{CJK UNIFIED IDEOGRAPH-56ED}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 32593 (\N{CJK UNIFIED IDEOGRAPH-7F51}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 29992 (\N{CJK UNIFIED IDEOGRAPH-7528}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 25143 (\N{CJK UNIFIED IDEOGRAPH-6237}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 27969 (\N{CJK UNIFIED IDEOGRAPH-6D41}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 37327 (\N{CJK UNIFIED IDEOGRAPH-91CF}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 32858 (\N{CJK UNIFIED IDEOGRAPH-805A}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 31867 (\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
E:\用户画像\聚类分离用户数据\聚类分离校园网数据.py:234: UserWarning: Glyph 31751 (\N{CJK UNIFIED IDEOGRAPH-7C07}) missing from font(s) DejaVu Sans.
plt.savefig('cluster_visualization.png', dpi=300)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 20027 (\N{CJK UNIFIED IDEOGRAPH-4E3B}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 25104 (\N{CJK UNIFIED IDEOGRAPH-6210}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 20998 (\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 26657 (\N{CJK UNIFIED IDEOGRAPH-6821}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 22253 (\N{CJK UNIFIED IDEOGRAPH-56ED}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 32593 (\N{CJK UNIFIED IDEOGRAPH-7F51}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 29992 (\N{CJK UNIFIED IDEOGRAPH-7528}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 25143 (\N{CJK UNIFIED IDEOGRAPH-6237}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 27969 (\N{CJK UNIFIED IDEOGRAPH-6D41}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 37327 (\N{CJK UNIFIED IDEOGRAPH-91CF}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 32858 (\N{CJK UNIFIED IDEOGRAPH-805A}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 31867 (\N{CJK UNIFIED IDEOGRAPH-7C7B}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
C:\Program Files\JetBrains\PyCharm 2025.1.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:124: UserWarning: Glyph 31751 (\N{CJK UNIFIED IDEOGRAPH-7C07}) missing from font(s) DejaVu Sans.
FigureCanvasAgg.draw(self)
聚类可视化图已保存为 cluster_visualization.png
聚类完成! 结果文件已保存:
- elbow_method.png: 肘部法则图
- cluster_results.csv: 详细聚类结果
- cluster_visualization.png: 聚类可视化
进程已结束,退出代码为 0