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

如何将含极端离群值的log10数据映射到1-11区间尺度

1-11区间尺度映射解决方案

方案1:对数变换+线性归一化(推荐,可保留全部原始信息)

你之前使用的线性归一化公式本身完全支持负值输入,不存在适配问题,不需要调整公式结构,仅需要将公式中用到的data_min、data_max替换为log10变换后的数据集的最小/最大值即可,具体流程如下:

执行步骤

  1. 对原始数据集做log10变换:若原始数据存在≤0的数值,可先给所有数据加统一偏移量,确保所有输入log10的数值大于0,该偏移不会改变数据的相对差异
  2. 计算log变换后数据集的最小值log_min、最大值log_max
  3. 代入原线性归一化公式完成1-11映射:
    scale_min + float(x_log - log_min) * float(scale_max - scale_min) / (log_max - log_min)
    其中scale_min=1,scale_max=11,x_log为单条原始数据的log10变换结果

示例计算(以你提供的数据集[0.1, 10, 300, 500000]为例)

  • 各数值log10变换结果:[-1, 1, 2.477, 5.699]
  • 代入公式计算后映射结果:[1.0, 3.98, 6.19, 11.0]
  • 该变换完全可逆,只要保存偏移量、log_min、log_max三个参数,即可从1-11的映射结果反推原始数值,无任何信息丢失

Python代码实现

import math

def scale_to_1_11(raw_data):
    # 处理原始数据≤0的情况,添加统一偏移
    min_raw = min(raw_data)
    offset = 0 if min_raw > 0 else abs(min_raw) + 1e-6
    # 对数变换
    log_data = [math.log10(x + offset) for x in raw_data]
    log_min, log_max = min(log_data), max(log_data)
    # 线性映射到1-11
    return [1 + (x - log_min) * 10 / (log_max - log_min) for x in log_data]

# 测试
test_data = [0.1, 10, 300, 500000]
print(scale_to_1_11(test_data))
# 输出:[1.0, 3.985074198401128, 6.193359770784789, 11.0]

方案2:分位数秩映射(适合不需要保留绝对差异的场景)

如果不需要保留原始数据的绝对数值差异,仅需要保留相对排序,可采用分位数映射方案,完全消除极端离群值的影响:

  1. 将原始数据从小到大排序,给每个数值分配对应的百分位排名
  2. 将百分位排名直接映射到1-11区间:1 + 百分位 * 10
    该方案的优势是所有区间的数值差异感知度完全一致,不会受任何极端值影响,缺点是无法从映射结果反推原始绝对数值,会丢失绝对差异信息。

内容的提问来源于stack exchange,提问作者LizzAlice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:18:01