数据预处理之python实现噪声处理

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

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

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

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

正态分布公式

其中,σ可以表示成数据集的标准差,μ代表数据集的均值,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))

运行结果:
在这里插入图片描述

声明:本文为转载文章
原文链接:https://blog.csdn.net/M_WBCG/article/details/79117085

发布了21 篇原创文章 · 获赞 43 · 访问量 4999

猜你喜欢

转载自blog.csdn.net/weixin_42878211/article/details/104939118