【问题标题】:Python Normalization Function: Minimize Value as it GrowsPython 规范化函数:随着价值的增长而最小化
【发布时间】:2020-12-04 00:41:32
【问题描述】:

我有这个数组显示一些X 产品的用户数量:

users_by_product = [28742, 67514, 3312, 430089, 16125, 11984, 625074, 21800386, 7851, 33,
                    3751, 21659, 99, 67, 84800, 495868, 95100, 2400, 2700, 2800, 3200, 3600]

我需要将这些值映射到 0 到 10 的范围内,所以我目前正在这样做:

for product_users in users_by_product:
    visitors_scaled = (10*(product_users - np.min(users_by_product))/np.ptp(users_by_product)).astype(int)

其中product_usersusers_by_product[i]。输出:

[0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

问题是这个变量返回所有零除了一个产品的 10(因为该产品有很多用户),这里是 users_by_product 的图。

正如您所看到的,有一个产品有很多用户,即获得 10 分,其余的只有零分,我的问题是,是否有一种方法可以最大限度地减少该值在函数中的影响,因为它增加了,所以巨大的价值不会对最终结果产生太大影响,而我其他人可以在保持初始关系的同时获得一些不同于零的价值。

【问题讨论】:

  • 通过处理日志来压缩数据范围。您的 minimal reproducible example 应该显示所需的任何导入。什么是product_users...NameError: name 'product_users' is not defined
  • @wwii product_usersusers_by_product 的每个值。所以应该为users_by_product中的每个product_users调用返回0到10范围的代码行。
  • @wwii 我已经用要运行的确切代码更新了问题。

标签: python python-3.x numpy math


【解决方案1】:

在计算之前通过取其日志来压缩数据的范围。

import math
import numpy as np
users_by_product = [28742, 67514, 3312, 430089, 16125, 11984, 625074, 21800386, 7851, 33,
                    3751, 21659, 99, 67, 84800, 495868, 95100, 2400, 2700, 2800, 3200, 3600]

users_by_product = [math.log(n) for n in users_by_product]
for product_users in users_by_product:
    visitors_scaled = (10*(product_users - np.min(users_by_product))/np.ptp(users_by_product)).astype(int)
    print(visitors_scaled,end=', ')

>>> 
5, 5, 3, 7, 4, 4, 7, 10, 4, 0, 3, 4, 0, 0, 5, 7, 5, 3, 3, 3, 3, 3,

【讨论】:

  • 另请注意,为了计算日志,您可以使用np.log(users_by_product)
  • .. 你从一个 Python 列表开始,所以我选择了列表推导,以免过多地改变你的过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多