DBSCAN聚类交互式绘图代码报错及修复咨询
问题解决:DBSCAN交互式绘图修复
核心问题分析
- NameError: train_test_split未定义:你提到已导入但仍报错,可能是代码中未实际使用该模块却保留了调用,或是导入语句位置错误。从你提供的代码看,
train_test_split并未被使用,可直接移除该导入,或检查是否有遗漏的代码片段使用了它。 - 交互逻辑失效:滑块参数未传递给DBSCAN模型,且UI布局存在重复定义和变量错误。
修复后的完整代码
import pandas as pd import numpy as np from sklearn.cluster import DBSCAN import ipywidgets as widgets from ipywidgets import Layout, interactive_output, HBox, VBox import matplotlib.pyplot as plt # 加载数据 df_mv = pd.read_csv("https://raw.githubusercontent.com/HanaBachi/MachineLearning/main/multishape.csv") # 创建UI组件 title_text = widgets.Text( value='DBSCAN, Hana Bachi, The University of Texas at Austin', layout=Layout(width='950px', height='30px') ) eps_slider = widgets.FloatSlider( min=0.05, max=2.0, value=0.155, step=0.05, description='eps:', orientation='horizontal', style={'description_width': 'initial'}, continuous_update=False ) min_pts_slider = widgets.IntSlider( min=2, max=10, value=5, step=1, description='min_samples:', orientation='horizontal', style={'description_width': 'initial'}, continuous_update=False ) # 定义绘图函数 def dbscan_plot(eps, min_samples): # 训练DBSCAN模型 db = DBSCAN(eps=eps, min_samples=min_samples).fit(df_mv) labels = db.labels_ n_clusters = len(set(labels)) - (1 if -1 in labels else 0) n_noise = list(labels).count(-1) # 准备数据 x = df_mv.values[:, 0] y = df_mv.values[:, 1] # 绘制图形 plt.figure(figsize=(14,7)) plt.scatter(x, y, c=labels, cmap='tab10', s=50) plt.scatter(x[labels == -1], y[labels == -1], c='k', marker='x', s=100, label='噪声点') plt.title(f'DBSCAN聚类结果: 簇数={n_clusters}, 噪声点={n_noise}', fontsize=20) plt.legend() plt.colorbar(ticks=range(n_clusters), label='簇标签') plt.show() # 创建交互输出 interactive_plot = interactive_output(dbscan_plot, {'eps': eps_slider, 'min_samples': min_pts_slider}) # 布局UI ui = VBox([ title_text, HBox([eps_slider, min_pts_slider]), interactive_plot ]) # 显示UI display(ui)
关键修复点说明
- 导入补全:添加了所有必要的库导入(pandas、numpy、sklearn、ipywidgets、matplotlib)。
- 参数传递修复:绘图函数
dbscan_plot现在正确使用滑块传入的eps和min_samples参数,而非硬编码值。 - 滑块类型修正:将
minPts改为IntSlider,因为DBSCAN的min_samples必须是整数。 - UI结构优化:移除重复的UI组件定义,统一布局为垂直盒子,包含标题、滑块和绘图区域。
- 功能增强:在标题中显示当前簇数和噪声点数量,添加图例说明噪声点。
- 错误输出恢复:移除了
sys.stdout重定向,方便调试时查看错误信息。 - 变量名规范:更改变量名使其更清晰(如
eps_slider替代eps),避免与函数参数混淆。
内容的提问来源于stack exchange,提问作者Hana Bachi
相关产品推荐
相关产品推荐

