数据预处理--噪声

1.噪声是什么?数据集中的干扰数据(对场景描述不许确的数据)python

2.噪声怎么产生的?举个例子:手机信号来自于基站发射的电磁波,有的地方比较强,有的地方比较弱。运营商的工程师会负责统计不一样区域信号强弱来进行网络规划,工程师采集信号的方法就是将一个信号接受终端固定到车上,而后开车绕着基站转,信号终端就会自动采集不一样区域的信号强度,生成一份数据。可是若是车在采集过程当中遇到了突发事件、急刹车,就可能会对信号采集形成必定的影响,生成噪声数据。算法

3.噪声对模型训练有什么影响?不少算法,特别是线性算法,都是经过迭代来获取最优解的,若是数据中含有大量的噪声数据,将会大大的影响数据的收敛速度,甚至对于训练生成模型的准确也会有很大的反作用。网络

4.去除噪声的方法:根据不一样的业务场景有不一样的处理方法,这里只提出正态分布3σ原则。正态分布也叫常态分布,是连续随机变量几率分布的一种,天然界、人类社会、心理、教育中大量现象均按正态分布,如能力的高低、学生成绩的好坏都属于正态分布,咱们能够把数据集的质量分布立杰成一个正态分布。它会随着随机变量的平均数、标准差与单位不一样而有不一样的分布形态。正态分布能够表示成一种几率密度函数。app

正态分布公式
  • formula
其中, σ能够表示成数据集的标准差,μ表明数据集的均值,x表明数据集的数据。相对于正常数据,噪声数据能够理解为小几率数据。


正态分布具备这样的特色:x落在(μ-3σ,μ+3σ)之外的几率小于千分之三。根据这一特色,咱们能够经过计算数据集的标准差,把三倍于数据集的标准差的点设想为噪声数据排除。函数

示例

from __future__ import division

mat = [[19, 26, 63], [13, 62, 65], [16, 69, 15], [14, 56, 17], [19, 6, 15], [11, 42, 15], [18, 58, 36], [12, 77, 33],
       [10, 75, 47], [15, 54, 70], [10017, 1421077, 4169]]


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


# 获得每一个字段的平均值
def GetAverage(mat):
    n = len(mat)
    m = width(mat)
    num = [0] * m
    for i in range(0, m):
        for j in mat:
            num[i] += j[i]
        num[i] = num[i] / n
    return num


# 得到每一个字段的标准差
def GetVar(average, mat):
    ListMat = []
    for i in mat:
        ListMat.append(list(map(lambda x: x[0] - x[1], zip(average, i))))

    n = len(ListMat)
    m = width(ListMat)
    num = [0] * m
    for j in range(0, m):
        for i in ListMat:
            num[j] += i[j] * i[j]
        num[j] /= n
    return num

# 得到每一个字段的标准差
def GetStandardDeviation(mat):
    return list(map(lambda x:x**0.5,mat))
# 对数据集去噪声
def DenoisMat(mat):
    average = GetAverage(mat)
    variance = GetVar(average, mat)
    standardDeviation=GetStandardDeviation(variance)
    section = list(map(lambda x: x[0] + 3*x[1], zip(average, standardDeviation)))
    n = len(mat)
    m = width(mat)
    num = [0] * m
    denoisMat = []
    noDenoisMat=[]
    for i in mat:
        for j in range(0, m):
            if i[j] > section[j]:
                denoisMat.append(i)
                break
            if j==(m-1):
                noDenoisMat.append(i)
    print("去除完噪声的数据:")
    print(noDenoisMat)
    print("噪声数据:")
    return denoisMat


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

数据过滤:一组数据中,里面有一个字段对于结果没有任何的意义,就能够将该字段过滤掉。就例如一组数据的用户ID不具有描述行为特性的含义。