无法正确输入node2vec嵌入数据至DBSCAN聚类的问题求助
解决node2vec嵌入数据DBSCAN聚类问题的实操步骤
一、正确读取CSV,提取纯数值矩阵
针对你提到的两种CSV格式,分别处理:
- 首列为节点名的CSV:
读取时将第一列设为索引,直接提取数值部分:import pandas as pd df = pd.read_csv('your_embedding.csv', index_col=0) # 替代弃用的as_matrix,二选一即可 X = df.values # 或者 df.to_numpy() - 首行为节点名的CSV:
直接读取后提取数值(首行自动作为列名,不影响数值矩阵提取):
注意:如果节点名混入非字符串内容,可能导致pandas将某列识别为df = pd.read_csv('your_embedding.csv') X = df.valuesobject类型,进而让X中混入非数值数据。务必检查df.dtypes,确保所有列都是float64或int64类型。
二、排查并清理非法数值
报错提示的NaN/无穷大是核心问题,必须彻底清理:
import numpy as np # 先统计异常值数量 print("NaN数量:", np.isnan(X).sum()) print("无穷大数量:", np.isinf(X).sum()) # 清理方案二选一: # 方案1:将异常值替换为矩阵的均值/极值(适合少量异常) X_clean = np.nan_to_num(X, nan=np.nanmean(X), posinf=np.nanmax(X), neginf=np.nanmin(X)) # 方案2:删除包含异常值的节点行(适合异常值多且节点可舍弃的场景) clean_df = df.dropna(axis=0, how='any') clean_df = clean_df[~clean_df.isin([np.inf, -np.inf]).any(axis=1)] X_clean = clean_df.values
额外提醒:node2vec嵌入本身不应出现这些异常值,大概率是CSV保存环节出了问题——比如用错分隔符(把逗号写成分号)、保存时数据截断、导出时混入额外注释行。可以用记事本打开CSV,检查是否有空单元格、乱码或不完整的行。
三、替换弃用的as_matrix方法
直接用df.values或df.to_numpy()替代as_matrix(),这两种是sklearn官方推荐的写法,不会触发弃用警告。
四、验证输入合法性
喂给DBSCAN前,先确认数据格式合规:
print("数据类型:", X_clean.dtype) # 必须为float64 print("数据形状:", X_clean.shape) # 格式应为(节点数, 嵌入维度) print("数值范围:", np.min(X_clean), np.max(X_clean)) # 排查是否存在离谱极值 # 如果类型不符,强制转换 X_clean = X_clean.astype(np.float64)
五、DBSCAN调用示例
用清理后的矩阵执行聚类:
from sklearn.cluster import DBSCAN # eps和min_samples需根据你的嵌入数据调整,比如先试eps=0.5、min_samples=3 dbscan = DBSCAN(eps=0.5, min_samples=3) cluster_labels = dbscan.fit_predict(X_clean) # 查看聚类结果 print("每个节点的聚类标签:", cluster_labels) print("有效聚类数(不含噪声点):", len(set(cluster_labels)) - (1 if -1 in cluster_labels else 0))
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

