给数组中的每个数据加上噪音的方法:
import numpy as np
a = np.arange(10).reshape(5,2)
a
Out[83]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
假设原数组如上所示,为5行2列,那么想给每个数据都加上噪音可以一行代码完成:
np.random.normal(a, err)
其中err是欲设置的噪音的方差。
具体的理解就是:
如果对于np.random.normal这个方法,如果传入的参数是数组型的,比如第一个参数是[1, 2, 3], 第二个参数是数字型,第三个参数可选,如果第三个参数也传入,则该参数就必须是数字,因为这时候生成的数组的shape是(k, 3),k就是第三个参数值,数组的每一列分别满足均值为1,2和3,方差都为4的正态分布;
而如果第一个参数传入的是(m, n)的这种,那么第三个参数是无法指定的(目前我是这么感觉的),第二个参数,也就是scale,如果也要传入数组,那么形状必须和第一个参数相同,也即(m,n),否则只能传入标量数值,生成的结果也是(m,n)的数组,相当把数组中的每个数变成以该位置原数据为均值,以第二个参数为方差的有噪音的数据,这样就实现了给所有的数据都加上噪音。
下面是一个手写数字的加噪音应用实例:
from sklearn.datasets import load_digits
digits = load_digits()
def plot_digits(data):
fig, ax = plt.subplots(4, 10, subplot_kw=dict(xticks=[], yticks=[]),
gridspec_kw=dict(wspace=0.1, hspace=0.1))
for i, axi in enumerate(ax.flat):
axi.imshow(data[i].reshape(8, 8), cmap='binary',
interpolation='nearest', vmin=0, vmax=16)
plt.show()
"""不加噪音画图"""
plot_digits(digits.data)
"""加噪音后画图"""
noisy = np.random.normal(digits.data, 4)
plot_digits(noisy)
加噪音前画图:
加噪音后画图: