数据预处理--归一化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_WBCG/article/details/79109474

归一化是指一种简化计算的方式,将数据经过处理后限定到一定的范围之内,一般都会将数据限定在[0,1]。数据归一化可以加快算法的收敛速度,而且对后续的数据处理上也比较方便。归一化算法是一种去量纲的行为。

归一化具体计算方法:y=(x-MinValue)/(MaxValue-MinValue),这里的MaxValue和MinValue分别是矩阵中每一个字段的最大值和最小值,x是字段中的值,y是归一化结果。

示例

注:(1)list() 方法用于将元组转换为列表。
                元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放在括号中,列表是放于方括号中。
        (2)map() 会根据提供的函数对指定序列做映射。
                 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
                 使用方法:>>>def square(x) :            # 计算平方数
                                           return x ** 2
                                   >>> map(square, [1,2,3,4,5])  #调用square函数
                                   结果:[1, 4, 9, 16, 25]
                                   >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
                                   结果:[1, 4, 9, 16, 25]
                                   # 提供了两个列表,对相同位置的列表数据进行相加
                                   >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
                                   结果:[3, 7, 11, 15, 19]

from __future__ import division
#矩阵
mat = [[63, 145, 233, 150, 2.3, 0], [67, 160, 286, 108, 1.5, 3], [67, 120, 229, 129, 2.6, 2]]


# 获得矩阵的字段数量
def width(lst):
    i = 0;
    for j in lst[0]:
        i += 1
    return i


def AutoNorm(mat):
    n = len(mat)
    m = width(mat)
    MinNum = [999999] * m
    MaxNum = [0] * m
    for i in mat:
        for j in range(0, m):
            if i[j] > MaxNum[j]:
                MaxNum[j] = i[j]
    print("MaxNum:")
    print(MaxNum)
    for p in mat:
        for q in range(0, m):
            if p[q] <= MinNum[q]:
                MinNum[q] = p[q]
    print("MinNum:")
    print(MinNum)
    section = list(map(lambda x: x[0] - x[1], zip(MaxNum, MinNum)))
    print("MaxNum-MinNum:")
    print(section)
    NorMat = []
    for k in mat:
        distance = list(map(lambda x: x[0] - x[1], zip(k, MinNum)))
        value = list(map(lambda x: x[0] / x[1], zip(distance, section)))
        NorMat.append(value)
    print("归一化结果:")
    return NorMat


if __name__ == '__main__':
    print("初始数据:")
    print(mat)
    print(AutoNorm(mat))

公式中如果某一字段的最大值和最小值相同,会出现分母为0的情况。所以要根据字段数据来判断,如果当前字段全部相同且为1,就按1处理。如果当前字段为0,那就直接保留0。

猜你喜欢

转载自blog.csdn.net/M_WBCG/article/details/79109474
今日推荐