【问题标题】:Normalization of dictionary values字典值的规范化
【发布时间】:2020-12-31 04:20:13
【问题描述】:

对于numpy数组中元素的归一化,我们可以使用sklearn normalize函数:

import numpy as np
from sklearn.preprocessing import normalize

b=np.array([[0, 0.2, 0.2, 0.2, .30, .24, 0]])
print(type(b))
normalized = normalize(b)
print("Normalized Data = ", normalized)

有什么方法可以使用 sklearn 中的相同规范化函数来处理字典值?

我有一本像这样的字典:

xy = {'a': 0.2, 'b': 0.2, 'c': 0.2, 'd': 0.3021651247531982, 'e': 0.24462871026284194}

并希望对其值进行规范化,以便输出可以是:

xy = {'a': 0.38408524, 'b' : 0.38408524, 'c' : 0.38408524, 'd' : 0.58028582, 'e' : 0.4697913}

【问题讨论】:

  • @Sandy 您要应用什么类型的规范化?

标签: python numpy dictionary scikit-learn normalization


【解决方案1】:

默认情况下,Normalizer 函数会考虑 L-2 范数归一化,但在以下示例中,我们将额外考虑 L-1 范数归一化。例如,您提供的数组将是

X = np.array([val for val in xy.values()])

# If you're considering norm-1
norm_1 = np.abs(X).sum(axis=0)

# If you're considering norm-2
norm_2 = np.sqrt((X**2).sum(axis=0))


print(f'X with norm 1: {X/norm_1}')
>>> 
X with norm 1: [0.17439926 0.17439926 0.17439926 0.26348688 0.21331533]
print(f'X with norm 2: {X/norm_2}')
>>>
X with norm 2: [0.38408524 0.38408524 0.38408524 0.58028582 0.46979139]

现在要直接将L-2 规范应用于字典,我们必须手动执行。在这种情况下,我们已经计算了数组的norm-1norm-2 值。所以很容易将它们应用到字典中。考虑以下代码

# Apply norm-2 to each value in the dict
{key:xy[key]/norm_2 for key in xy.keys()}
>>> {'a': 0.3840852409148149,
 'b': 0.3840852409148149,
 'c': 0.3840852409148149,
 'd': 0.580285823684436,
 'e': 0.4697913855799205}

# Apply norm-1 to each value in the dict
{key:xy[key]/norm_1 for key in xy.keys()}
>>> {'a': 0.17439926331414451,
 'b': 0.17439926331414451,
 'c': 0.17439926331414451,
 'd': 0.26348687578092167,
 'e': 0.21331533427664467}

【讨论】:

    【解决方案2】:

    使用dict.items() 创建一个 numpy 数组。然后在第二列应用normalize。最后从 numpy 数组创建字典。

    z = np.array(list(xy.items()), dtype=object)
    z[:, 1] = normalize(z[:, 1].reshape(1, z.shape[0]))
    
    xy = dict(z)
    print(xy)
    

    输出:

    {'a': 0.3840852409148149, 'b': 0.3840852409148149, 'c': 0.3840852409148149, 'd': 0.580285823684436, 'e': 0.4697913855799205}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 2021-07-11
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多