scipy-数据处理应用.ppt

上传人:xt****7 文档编号:2383435 上传时间:2019-11-22 格式:PPT 页数:52 大小:809.76KB
返回 下载 相关 举报
scipy-数据处理应用.ppt_第1页
第1页 / 共52页
scipy-数据处理应用.ppt_第2页
第2页 / 共52页
scipy-数据处理应用.ppt_第3页
第3页 / 共52页
点击查看更多>>
资源描述
科学计算包SciPY及应用,第11讲,Scipy简介,解决python科学计算而编写的一组程序包 快速实现相关的数据处理 如以前的课程中的积分,Scipy提供的数据I/O,相比numpy,scipy提供了更傻瓜式的操作方式 二进制存储 from scipy import io as fio import numpy as np x=np.ones(3,2) y=np.ones(5,5) fio.savemat(rd:111.mat,mat1:x,mat2:y) data=fio.loadmat(rd:111.mat,struct_as_record=True) datamat1,Scipy的IO,datamat1 array( 1., 1., 1., 1., 1., 1.) datamat2 array( 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.),统计假设与检验 stats包,stats提供了产生连续性分布的函数, 均匀分布(uniform)、 正态分布(norm)、 贝塔分布(beta); 产生离散分布的函数, 伯努利分布(bernoulli)、 几何分布(geom) 泊松分布 poisson 使用时,调用分布的rvs方法即可,统计假设与检验 stats包,import scipy.stats as stats x=stats.uniform.rvs(size=20) #产生20个在0,1均匀分布的随机数 y=stats.beta.rvs(size=20,a=3,b=4) 产生20个服从参数a=3,b=4的贝塔分布随机数 z=stats.norm.rvs(size=20,loc=0,scale=1) 产生了20个服从0,1正态分布的随机数 x=stats.poisson.rvs(0.6,loc=0,size=20) 产生poisson分布,假设检验,假设给定的样本服从某种分布,如何验证? import numpy as np import scipy.stats as stats normDist=stats.norm(loc=2.5,scale=0.5) z=normDist.rvs(size=400) mean=np.mean(z) med=np.median(z) dev=np.std(z) print(mean=,mean, med=,med, dev=,dev) 设z是实验获得的数据,如何验证它是否是正态分布的?,假设检验,假设给定的样本服从某种分布,如何验证? statVal, pVal = stats.kstest(z,norm,(mean,dev) print(pVal=,pVal) 计算得到: pVal= 0.667359687999 结论:我们接受假设,既z数据是服从正态分布的,信号特征,低频的原始信号,加高频的噪声 如何去掉噪声?,快速傅里叶变换 FFT,应用范围非常广,在物理学、化学、电子通讯、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等 原理是将时域中的测量信号转换到频域,然后再将得到的频域信号合成为时域中的信号 时域信号转换为频域信号时,将信号分解成幅值谱,显示与频率对应的幅值大小 一个信号是由多种频率的信号合成的 将这些信号分离,就能去掉信号中的噪声,快速傅里叶变换 FFT,Scipy类库中提供了快速傅里叶变换包fftpack,FFT应用案例产生带噪声的信号,import numpy as np import matplotlib.pyplot as plt from scipy import fftpack as fft timeStep = 0.02 # 定义采样点间隔 timeVec = np.arange(0, 20, timeStep) # 生成采样点 # 模拟带高频噪声的信号sig sig = np.sin( np.pi / 5 * timeVec) + 0.1 * np.random.randn(timeVec.size) # 表达式中后面一项为噪声 plt.plot(timeVec, sig) plt.show(),信号特征,低频的原始信号,加高频的噪声 如何去掉噪声?,FFT信号变换 sig已知,n=sig.size sig_fft = fft.fft(sig) # 正变换后的结果保存在 sig_fft中 sampleFreq = fft.fftfreq(n, d=timeStep) # 获得每个采样点频率幅值 pidxs = np.where(sampleFreq 0) # 结果是对称的,仅需要使用谱的正值部分来找出信号频率 freqs = sampleFreqpidxs # 取得所有正值部分 power = np.abs(sig_fft)pidxs # 找到对应的频率振幅值 freq = freqspower.argmax() # 假设信噪比足够强,则最大幅值对应的频率,就是信号的频率 sig_fftnp.abs(sampleFreq) freq = 0 # 舍弃所有非信号频率 main_sig = fft.ifft(sig_fft) # 用傅立叶反变换,重构去除噪声的信号 plt.plot(timeVec, main_sig, linewidth=3),寻优,f(x)=x2-4*x+8 在x=2的位置,函数有最小值4,寻优,scipy.optimize包提供了求极值的函数fmin from scipy.optimize import fmin import numpy as np def f(x): return x*2-4*x+8 print (fmin(f, 0),Optimization terminated successfully. Current function value: 4.000000 Iterations: 27 Function evaluations: 54,多维寻优,z=x2+y2+8 from scipy.optimize import fmin def myfunc(p): # 注意定义 x,y=p return x*2+y*2+8 p=(1,1) print (fmin(myfunc, p ),多维寻优,Optimization terminated successfully. Current function value: 8.000000 Iterations: 38 Function evaluations: 69 -2.10235293e-05 2.54845649e-05,全局寻优,y=x2 + 20 sin(x),全局寻优-0开始,from scipy import optimize import matplotlib.pyplot as plt import numpy as np def f(x): return x*2 + 20 * np.sin(x) ans=optimize.fmin_bfgs(f, 0) print(ans),全局最优求解,Optimization terminated successfully. Current function value: -17.757257 Iterations: 5 Function evaluations: 24 Gradient evaluations: 8 当起始点设置为0时,它找到了0附近的最小极值点,该解也是全局最优解,全局寻优-5开始,from scipy import optimize import matplotlib.pyplot as plt import numpy as np def f(x): return x*2 + 20 * np.sin(x) ans=optimize.fmin_bfgs(f, 5) print(ans),全局最优求解,Optimization terminated successfully. Current function value: 0.158258 Iterations: 5 Function evaluations: 24 Gradient evaluations: 8 4.27109534 当起始点设置为5时,它找到了5附近的局部最优,全局最优求解代替方案optimize.fminbound,from scipy import optimize import numpy as np def f(x): return x*2 + 20 * np.sin(x) ans = optimize.fminbound(f, -100, 100) print(ans) print(f(ans) -1.42755181859 -17.7572565315,高维网格寻优,def f(x,y): z=(np.sin(x)+0.05*x*2) + np.sin(y)+0.05*y*2 return z,高维网格寻优,import numpy as np def f(p): x,y=p ans=(np.sin(x)+0.05*x*2) + np.sin(y)+0.05*y*2 return ans import scipy.optimize as opt rranges = (slice(-10, 10, 0.1), slice(-10, 10, 0.1) res=opt.brute(f,rranges) print(res) print(f(res) x和y都是在-10,10区间内,采用步长0.1进行网格搜索求最优解 -1.42755002 -1.42749423 -1.77572565134,求解一元高次方程的根,from scipy import optimize import numpy as np def f(x): return x*2 + 20 * np.sin(x) ans = optimize.fsolve(f, -4) print(ans) print(f(ans) -2.75294663 1.68753900e-14 # 不同的初值,会怎么样?,非线性方程组求解,scipy. optimize的fsolve函数也可以方便用于求解非线性方程组 求解原则:将方程组的右边全部规划为0 将方程组定义为如下格式的python函数 def f(x): x1,x2, xn=x return f1(x1, x2, xn), f2(x1,x2, xn),.,非线性方程组求解 例子,2*x1+3=0 4*x02 + sin(x1*x2)=0 x1*x2/2 3=0,非线性方程组求解 例子,from scipy.optimize import fsolve from math import * def f(x): x0, x1,x2 = x return 2*x1+3, 4*x0*x0 + sin(x1*x2), x1*x2/2 - 3 ans = fsolve(f, 1.0,1.0,1.0) print (ans) print (f(ans) -0.26429884 -1.5 -4. 0.0, 1.1482453876610066e-10, 6.4002136923591024e-12,常微分方程组求解,洛仑兹函数可以用下面微分方程描述 方程定义了三维空间中各个坐标点上的速度矢量。从某个坐标开始沿着速度矢量进行积分,就可以计算出无质量点在此空间中的运动轨迹 ,为三个常数,x,y,z为点的坐标,常微分方程组求解,Scipy中提供了函数odeint,负责微分方程组的求解 是一个参数非常复杂的函数,但通常我们关心的只是该函数的前3项,因此,函数的调用格式可以缩写为: odeint(func, y0, t) func是有关微分方程组的函数, y0是一个元组,记录每个变量的初值, t则是一个时间序列。 使用时请注意,oedint函数,要求微分方程必须化为标准形式,即dy/dt=f(y,t)。,常微分方程组求解 lorenz函数,def lorenz(w, t): # 给出位置矢量w,和三个参数r,p, b计算出 r=10.0 p=28.0 b=3.0 # w是 x,y,z的值 x, y, z = w # 直接与lorenz的计算公式对应 return np.array(r*(y-x), x*(p-z)-y, x*y-b*z) # 三个微分方程,每个作为一项,写进一个列表中,常微分方程组求解 loren函数,import numpy as np t = np.arange(0, 30, 0.01) # 创建时间点 # 调用odeint对lorenz进行求解, 用两个不同的初始值 track1 = odeint(lorenz, (0.0, 1.00, 0.0), t) track2 = odeint(lorenz, (0.0, 1.01, 0.0), t) # 绘图 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt fig = plt.figure() ax = Axes3D(fig) ax.plot(track1:,0, track1:,1, track1:,2) ax.plot(track2:,0, track2:,1, track2:,2) plt.show() print(track1),曲线拟合 curve-fit,给定的y=ax+b函数上的一系列采样点,并在这些采样点上增加一些噪声,然后利用scipy optimize包中提供的curve_fit方法,求解系数a和b,曲线拟合 curve-fit,from scipy import optimize import matplotlib.pyplot as plt import numpy as np def f(x,a,b): return a*x + b,曲线拟合 curve-fit,x = np.linspace(-10, 10, 30) y = f(x,2,1) ynew= y+ 3*np.random.normal(size=x.size) # 产生带噪声的数据点 popt, pcov = optimize.curve_fit(f,x,ynew) print(popt) print (pcov) plt.plot(x,y,color=r,label=orig) plt.plot(x,popt0*x+popt1,color=b,label=fitting) plt.legend(loc=upper left) plt.scatter(x,ynew) plt.show(),曲线拟合 curve-fit,popt= 1.99022068 0.34002638 pcov= 6.14619911e-03 -1.53673628e-11 -1.53673628e-11 2.19002498e-01 popt列表包含每个参数的拟合值,此例求得的a为1.99022068,b为0.34002638。pcov列表的对角元素是每个参数的方差。通过方差,可以评判拟合的质量,方差越小,拟合越可靠,插值,根据现有的试验点值,去预测中间的点值 采用线性、两次样条、三次样条插值,插值-案例,首先在0,10区间里等间距产生了20个采样点,并计算其sin值,模拟试验采集得到的20个点 采用线性、两次样条、三次样条插值函数插值拟合原函数sin(x),插值-案例,import numpy as np from scipy.interpolate import interp1d import matplotlib.pyplot as plt x=np.linspace(0,10*np.pi,20) #产生20个点 y=np.sin(x) # x,y 现在是假设的采样点,插值-案例,fl=interp1d(x,y,kind=linear) # 线性插值函数 fq=interp1d(x,y,kind=quadratic) # 二次样条插值 fc=interp1d(x,y,kind=cubic) # 三次样条插值 xint=np.linspace(x.min(),x.max(),1000) # 产生插值点 yintl=fl(xint) # 由线性插值得到的函数值 yintq=fq(xint) # 由二次样条插值函数计算得到的函数值 yintc=fc(xint) # 由三次样条插值函数计算得到的函数值 plt.plot(xint,yintl,color=r, linestyle=-,label=linear) plt.plot(xint,yintq,color=b ,label=quadr) plt.plot(xint,yintc,color=b ,linestyle=-.,label=cubic) plt.legend() plt.show(),插值-案例,插值-模拟带噪声的问题,Scipy还可以对含有噪声的数据,进行样条插值并自动过滤部分噪声,使用UnivariateSpline函数,并启动其s参数即可实现该功能 from scipy.interpolate import UnivariateSpline,插值-模拟带噪声的问题,import numpy as np from scipy.interpolate import UnivariateSpline import matplotlib.pyplot as plt sample=50 x=np.linspace(1,20*np.pi,sample) y=np.sin(x) + np.log(x) + np.random.randn(sample)/10 #在函数取值上增加了正态分布的随机噪声,插值-模拟带噪声的问题,f=UnivariateSpline(x,y,s=1) # s=1 启用s参数,生成行条函数 xint=np.linspace(x.min(),x.max(),1000) yint=f(xint) plt.plot(xint,yint,color=r, linestyle=-,label=interpolation) plt.plot(x,y,color=b ,label=orig) plt.legend(loc=upper left) plt.show(),多项式拟合处理,import numpy as np import matplotlib.pyplot as plt from scipy import signal # 引入信号处理包 from pylab import * mpl.rcParamsfont.sans-serif = SimHei X=np.mafromtxt(r“E:teach教改项目教材墨翠样品拉曼光谱墨翠墨绿四季豆.txt“) X=X.data x=X:,0 # 文件的第一列为拉曼测量的波数 y=X:,1 # 第二列为拉曼响应信号 plt.ylabel(u拉曼响应) plt.xlabel(u波数) plt.plot(x,y,r,label=orig) # 画带有基线的信号 plt.plot(x, signal.detrend(y), b,label=detrend) # 画去掉基线后的信号 plt.legend() plt.show(),多项式拟合处理,模式聚类,Scipy的聚类分析中主要提供了矢量量化分析和系统聚类法,模式聚类,import numpy as np from scipy.cluster import vq import matplotlib.pyplot as plt class1=np.random.randn(30,2)+10 # 产生第一个正态分布类,基础抬高10 class2=np.random.randn(40,2)-10 # 产生第二个正态分布类,基础降低10 class3=np.random.randn(50,2) # 产生第三个正态分布类 data=np.vstack(class1,class2,class3) #将数据叠合到一起,形成一个矩阵,模式聚类,centroid, var=vq.kmeans(data,3) # 用k均值聚类法聚类,指定按3个类别聚类,获取类中心和方差 key,distance=vq.vq(data,centroid) # 根据聚类中心,将不同的样本分类 vqclass1=datakey=0 # 取出类别0 vqclass2=datakey=1 vqclass3=datakey=2 plt.scatter(vqclass1:,0,vqclass1:,1,marker=o, color=“r“,label=c1) # 为类0 制图 plt.scatter(vqclass2:,0,vqclass2:,1,marker=1, color=“g“ ,label=c2) plt.scatter(vqclass3:,0,vqclass3:,1,marker=2, color=“b“,label=c3) plt.legend(loc=upper left) plt.show(),模式聚类,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!