实验目的
掌握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的求解结果。