实验目的

掌握Scipy库的基本模块,在数据处理是能够熟练应用。

实验原理

scipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,,特殊函数等等。

scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。

实验步骤

注意:python2中print语句不加括号,python3中print语句打印内容要加括号!

在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了。作为非专业程序员,科学家总是喜欢重新发明造轮子,导致了充满漏洞的,未经优化的,很难分享和维护的代码。相反,Scipy程序经过优化和测试,因此应该尽可能使用。

scipy 由一些特定功能的子模块组成:

scipy.cluster 矢量量化 / K-均值
scipy.constants 物理和数学常数
scipy.fftpack 傅里叶变换
scipy.integrate 积分程序
scipy.interpolate 插值
scipy.io 数据输入输出
scipy.linalg 线性代数程序
scipy.ndimage n维图像包
scipy.odr 正交距离回归
scipy.optimize 优化
scipy.signal 信号处理
scipy.sparse 稀疏矩阵
scipy.spatial 空间数据结构和算法
scipy.special 任何特殊数学函数

它们全依赖numpy,但是每个之间基本独立。导入Numpy和这些scipy模块的标准方式是:

主scipy命名空间大多包含真正的numpy函数(尝试 scipy.cos 就是 np.cos)。这些仅仅是由于历史原因,通常没有理由在你的代码中使用import scipy

导入和保存matlab文件:

实验:使用Scipy数值计算库莱实现最小二乘法。

最小二乘法的公式是:

# -*- coding: utf-8 -*-

import numpy as np

from scipy.optimize import leastsq #最小二乘法拟合函数leastsq

import pylab as pl

def func(x, p):

"""

数据拟合所用的函数: A\*sin\(2\*pi\*k\*x + theta\)

"""

A, k, theta = p

return A\*np.sin\(2\*np.pi\*k\*x+theta\)

def residuals(p, y, x):

"""

实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数

"""

return y - func\(x, p\)

x = np.linspace(0, -2*np.pi, 100) # 以0为起点,-2*pi为终点等差采样100个点

A, k, theta = 10, 0.34, np.pi/6 # 真实数据的函数参数

y0 = func(x, [A, k, theta]) # 真实数据

y1 = y0 + 2 * np.random.randn(len(x)) # 加入噪声之后的实验数据

p0 = [7, 0.2, 0] # 第一次猜测的函数拟合参数

# 调用leastsq进行数据拟合,p为需要拟合的参数

# residuals为计算误差的函数

# p0为拟合参数的初始值

# args为需要拟合的实验数据

plsq = leastsq(residuals, p0, args=(y1, x))

print u"真实参数:", [A, k, theta]

print u"拟合参数", plsq[0] # 实验数据拟合后的参数

pl.plot(x, y0, label=u"真实数据")

pl.plot(x, y1, label=u"带噪声的实验数据")

pl.plot(x, func(x, plsq[0]), label=u"拟合数据")

pl.legend()

pl.show()

p0里放的是A、k、theta的初始值,这个值可以随意指定。往后随着迭代次数增加,A、k、theta将会不断变化,使得residuals函数的值越来越小。

func函数里指出了待拟合函数的函数形状。

residuals函数为误差函数,我们的目标就是不断调整A、k、theta使得residuals不断减小。这里的residuals函数和神经网络中常说的cost函数实际上是一回事,只不过这里更简单些而已。

必须注意一点,传入leastsq函数的参数可以有多个,但必须把参数的初始值p0和其它参数分开放。其它参数应打包到args中。

leastsq的返回值是一个tuple,它里面有两个元素,第一个元素是A、k、theta的求解结果。

results matching ""

    No results matching ""