python进⾏数据预处理(最⼤最⼩值规范化、零均值规范化、剔除奇异值、去噪、曲线拟合)
博主此次数据挖掘作业是对数据进⾏预处理练习,我也是第⼀次接触并也是上⽹查阅资料完成,此篇⽂章算是作业总结,作为⼩⽩代码有冗余的地⽅,不⾜之处请海涵,欢迎斧正。
数据是mat⽂件——MATLAB存储数据的标准⽂件格式,在MATLAB中打开显⽰类似于单⾏EXCEL表格。由于本⼈⽔平较次,对python 更熟悉些,就不⽤matlab做,⽽⽤python。
⽬录
1.需要调⽤的库
import numpy as np
import scipy.io
import copy
import matplotlib.pyplot as plt
NumPy(Numerical Python) 是 Python 语⾔的⼀个扩展程序库,⽀持⼤量的维度数组与矩阵运算,此外
也针对数组运算提供⼤量的数学函数库;Scipy库是基于python⽣态的⼀款开源数值计算,科学与⼯程应⽤的开源软件;copy库⽤来拷贝数据;Matplotlib 是⼀个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境⽣成出版质量级别的图形,⽤来可视化数据。
2.读取mat⽂件中数据
mat⽂件链接:
datafile = 'E:\\pycharm\\Data_mining\\data_preprocess_practice.mat'#⽂件绝对路径
data = scipy.io.loadmat(datafile, mdict=None, appendmat=True) #载⼊MATLAB⽂件
scipy.io.loadmat ( file_name , mdict = None , appendmat = True , ** kwargs )
file_name:str型,mat ⽂件的名称(如果 appendmat==True,则不需要 .mat 扩展名)
mdict :dict,可选,在其中插⼊ matfile 变量的字典
appendmat:bool,可选,True的话将.mat加到给定⽂件名末尾
读取出来如图,这个数据由yy1、yy2、yy3等⼆维数组组成
3.最⼤最⼩值规范化、零均值规范化代码实现
#取出yy1,yy2,yy3⽣成数组
yy1 = data['yy1']
yy2 = data['yy2']
yy3 = data['yy3']
#最⼤最⼩值规范化以及零均值规范化函数
def standard(y):
#创建空数组存取第⼀、⼆列数
tem_1 = []
tem_2 = []
#取出第⼀列和第⼆列数据
for i in range(len(y)): #此处也可⽤for i,item in enumerate(y):
tem_1.append(y[i][0])
tem_2.append(y[i][1])
tem_1.sort()#对第⼀列数据进⾏排序
tem_2.sort()
max_1 = tem_1[-1]#取出第⼀列数据最⼤值
min_1 = tem_1[0]#取出第⼀列数据最⼩值
max_2 = tem_2[-1]
min_2 = tem_2[0]
xx = copy.deepcopy(y)#深拷贝以便后序进⾏零均值规范化
# 最⼩-最⼤规范化:
for j in range(len(y)):
y[j][0] = (y[j][0] - min_1)/(max_1 - min_1)#公式为x' = (x - min)/(max - min)映射到[0,1] y[j][1] = (y[j][1] - min_2)/(max_2 - min_2)
#零均值规范化
tem_1_std = np.std(tem_1, ddof=1) # 求第⼀列数据标准差
tem_2_std = np.std(tem_2, ddof=1)
tem_1_mean = np.mean(tem_1) # 求第⼀列数据平均值
tem_2_mean = np.mean(tem_2)
for k in range(len(xx)):
xx[k][0] = (xx[k][0] - tem_1_mean)/tem_1_std#公式为x' = (x - mean)/std
xx[k][1] = (xx[k][1] - tem_2_mean)/tem_2_std
print("最⼤最⼩规范化",y)
linspace numpyplt.figure('第⼀列规范化分布')
plt.plot(np.linspace(-40, 40, 20001), y[:, 0])
plt.figure('第⼆列规范化分布')
plt.plot(np.linspace(-40, 40, 20001), y[:, 1])
print("零均值规范化",xx)
#画出图像分布⽤于对⽐
plt.figure('第⼀列零均值分布')
plt.plot(np.linspace(-40, 40, 20001), xx[:, 0])
plt.figure('第⼆列零均值分布')
plt.plot(np.linspace(-40, 40, 20001), xx[:, 1])
plt.show()
return y,xx
standa(yy1)运⾏结果如图:
画出的图如图:
与原始图像对⽐:
代码中部分函数简介:
Array.sort(cmp=None, key=None, reverse=False)
cmp:⽤于⽐较的函数(⼤于时返回1,⼩于时返回-1,等于时返回0),⽐较什么由key决定,有默认值,迭代集合中的⼀项;
key:⽤列表元素的某个属性和函数进⾏作为关键字,有默认值,迭代集合中的⼀项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
copy.deepcopy()
将被复制对象完全再复制⼀遍作为独⽴的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产⽣影响。numpy.std(a, axis=None, dtype=None, out=None, ddof=0) ⽤于计算标准差
a: array_like,需计算标准差的数组
axis: int, 可选,默认情况是计算扁平数组的标准偏差。
dtype: dtype, 可选,⽤于计算标准差的类型。
out: ndarray, 可选,将结果放置在其中的替代输出数组。它必须具有与预期输出相同的形状,但如果有必要,类型(计算值的类型)将被转换。
ddof: int, 可选
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和⾼,单位为英⼨;
dpi:参数指定绘图对象的分辨率,即每英⼨多少个像素
facecolor:背景颜⾊
edgecolor:边框颜⾊
frameon:是否显⽰边框
plt.plot(x,y,format_string,**kwargs)
x:x轴数据
y:y轴数据
format_string:控制曲线的格式字串,其中包括颜⾊、风格、标记 4.剔除奇异值和去除⾼斯噪声代码实现注:此处代码承接上⽂·,是写在⼀个file中的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论