You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:55:18