數據預處理之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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章