如何使用UMAP实现带权重的高维数据降维操作
在UMAP中为DataFrame列设置不同权重实现降维
完全可以给UMAP的输入列设置不同权重,常见有两种实用实现方式,直接上代码和说明:
方法1:通过特征缩放间接赋予权重
这种方式最简单,核心思路是对需要强调的列放大缩放比例,弱化的列缩小比例,让UMAP计算距离时自然偏向权重高的列。
import umap import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler # 提取DataFrame中的数值型特征 X = df.select_dtypes(include=[np.number]).values # 定义各列权重数组,长度和特征维度一致 # 示例:前5列权重设为2,其余列设为0.5 weights = np.where(np.arange(X.shape[1]) < 5, 2, 0.5) # 先归一化到[0,1]消除量纲影响,再乘以权重 scaler = MinMaxScaler() X_scaled = scaler.fit_transform(X) X_weighted = X_scaled * weights # 运行UMAP降维到2维 reducer = umap.UMAP(n_components=2, random_state=42) embedding = reducer.fit_transform(X_weighted)
方法2:自定义带权重的距离函数
UMAP支持传入自定义距离度量函数,你可以在距离计算逻辑中直接给不同列赋予权重,这种方式更灵活,适合精确控制每列的影响力。
import umap import pandas as pd import numpy as np # 提取数值特征 X = df.select_dtypes(include=[np.number]).values # 定义权重数组:前3列权重依次为3、2、1,其余列设为0.5 weights = np.array([3, 2, 1] + [0.5]*(X.shape[1]-3)) # 自定义带权重的欧氏距离函数 def weighted_euclidean(x, y): diff = x - y weighted_diff = diff * weights return np.sqrt(np.sum(weighted_diff ** 2)) # 运行UMAP,指定metric为自定义函数 reducer = umap.UMAP(n_components=2, metric=weighted_euclidean, random_state=42) embedding = reducer.fit_transform(X)
注意事项
- 自定义距离函数的计算速度会比UMAP内置优化过的度量慢,数据量大时需考虑性能
- 权重值需根据业务场景调整,可多尝试几组权重组合对比降维结果
- 若DataFrame包含非数值列,需先做编码处理(如独热编码、标签编码)
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

