机器学习笔记--python之scipy

学习了numpy和matplotlib,基本上线性代数,概率论的很多计算啊之类的都可以很容易的实现了。此外再学习下scipy这个科学函数库吧。
scipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,特殊函数等等。


1 模块

scipy 由一些特定功能的子模块组成,它们全依赖numpy,但是每个之间基本独立

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

之后就学习下部分几个模块吧。


2 插值 scipy.interpolate

scipy.interpolate对从实验数据拟合函数来求值没有测量值存在的点非常有用
正弦函数的实验:

import numpy as np
from scipy.interpolate import interp1d
import pylab as plt 

measured_time = np.linspace(0, 1, 10) 
noise = (np.random.random(10)*2 - 1) * 1e-1
measures = np.sin(2 * np.pi * measured_time) + noise

#scipy.interpolate.interp1d类会构建线性插值函数:
linear_interp = interp1d(measured_time, measures)
#然后scipy.interpolate.linear_interp实例需要被用来求得感兴趣时间点的值:
computed_time = np.linspace(0, 1, 50) 
linear_results = linear_interp(computed_time)
#三次插值也能通过提供可选关键字参数kind来选择
cubic_interp = interp1d(measured_time, measures, kind='cubic')
cubic_results = cubic_interp(computed_time)
#Matplotlib图像中显示如下
plt.plot(measured_time, measures, 'o', ms=6, label='measures')
plt.plot(computed_time, linear_results, label='linear interp')
plt.plot(computed_time, cubic_results, label='cubic interp')
plt.legend()
plt.show()

运行结果如下:


3 信号处理 scipy. signal

3.1 移除信号的线性趋势

import numpy as np
import pylab as plt 
from scipy import signal

t = np.linspace(0, 3, 200)
x = t + np.random.normal(size=200)

plt.plot(t, x, linewidth=3)
#移除信号的线性趋势
plt.plot(t, signal.detrend(x), linewidth=3)

plt.show()

运行结果:

3.2FFT重采样

import numpy as np
import pylab as plt 
from scipy import signal

t = np.linspace(0, 5, 100)
x = np.sin(t)

plt.plot(t, x, linewidth=3)
#使用FFT重采样n个点
plt.plot(t[::2], signal.resample(x, 50), 'ko')
plt.show()

运行结果:


4 统计 scipy.stats

scipy.stats包括统计工具和随机过程的概率过程。各个随机过程的随机数生成器可以从numpy.random中找到。

模块功能
rvs随机变量(就是从这个分布中抽一些样本)
pdf概率密度函数
cdf累计分布函数
sf残存函数(1-CDF)
ppf分位点函数(CDF的逆)
isf逆残存函数(sf的逆)
stats返回均值,方差,(费舍尔)偏态,(费舍尔)峰度
moment分布的非中心矩

4.1 二项分布

抛掷10次硬币,假设在该试验中正面朝上的概率为0.3。使用stats.binom.pmf计算每次观测的概率质量函数。

import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

plt.subplot(121)
n = 10
p = 0.3 
k = np.arange(0, 30) 
binomial = stats.binom.pmf(k, n, p)
plt.plot(k, binomial, 'o-')
#使用rvs函数模拟一个二项随机变量,其中参数size指定你要进行模拟的次数,这里为10000次。
plt.subplot(122)
binom_sim = data = stats.binom.rvs(n=10, p=0.3, size=10000)
print "Mean: %g" % np.mean(binom_sim)
print "Sd: %g" % np.std(binom_sim, ddof=1)
plt.hist(binom_sim, bins=10, normed=True)

plt.show()

运行结果:
Mean: 2.9956
Sd: 1.44187

4.2 泊松分布

import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

rate =2
n = np.arange(0, 10) 
y = stats.poisson.pmf(n, rate)

plt.subplot(121)
plt.plot(n, y, 'o-')
#模拟1000个服从泊松分布的随机变量
plt.subplot(122)
data = stats.poisson.rvs(mu=2, loc=0, size=1000)
print "Mean: %g" % np.mean(data)
print "Sd: %g" % np.std(data, ddof=1)
plt.hist(data, bins=9, normed=True)

plt.show()

运行结果:
Mean: 2.105
Sd: 1.4677

4.3 正态分布

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt 

plt.subplot(121)
mu = 0 
sigma = 1 
x = np.arange(-5, 5, 0.1)
y = stats.norm.pdf(x, 0, 1)
plt.plot(x, y)

plt.subplot(122)

data = stats.norm.rvs(0, 1, size=1000)
plt.hist(data, bins=10, normed=True)

plt.show()

4.4 指数分布

import numpy as np
import matplotlib.pyplot as plt 
from scipy import stats

plt.subplot(121)
lambd = 0.5 
x = np.arange(0, 15, 0.1)
y = lambd*np.exp(-lambd*x)
plt.plot(x, y)

#下模拟1000个随机变量
plt.subplot(122)
data = stats.expon.rvs(scale=2, size=1000)
print "Mean: %g" % np.mean(data)
print "Sd: %g" % np.std(data, ddof=1)
plt.hist(data, bins=20, normed=True)

plt.show()

运行结果如下:
Mean: 2.01166
Sd: 2.02959


5 优化和拟合 scipy.optimize

优化是找到最小值或等式的数值解的问题

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
#定义以下函数x^2+2sin(x)
def f(x):
    return x**2+10*np.sin(x)

x = np.arange(-10, 10, 0.1)

#找到这个函数最小值一般而有效的方法是从初始点使用梯度下降法,这里用拟牛顿法
print optimize.fmin_bfgs(f, 0)

#如果函数有局部最小值,算法会因初始点不同找到这些局部最小而不是全局最小
print optimize.fmin_bfgs(f, 3, disp=0)

#为了找到全局最小点,最简单的算法是蛮力算法
grid = (-10, 10, 0.1)
xmin_global = optimize.brute(f, (grid,))
print xmin_global

#为了找到局部最小,我们把变量限制在(0, 10)之间
xmin_local =optimize.fminbound(f, 0, 10) 
print xmin_local

#找到标量函数的根
root1 = optimize.fsolve(f, 1)
print root1

root2 = optimize.fsolve(f, -2) 
print root2

#曲线拟合
xdata = np.linspace(-10, 10, num=20)
ydata = f(xdata) + np.random.random(xdata.size)

def f2(x, a, b): 
    return a*x**2+b*np.sin(x)

guess = [2, 2]
#通过最小二乘拟合拟合来找到幅度
params, params_convariance = optimize.curve_fit(f2, xdata, ydata, guess)
print params

#画图显示所有的信息
plt.plot(x, f(x), c='r', label="f(x)")
plt.plot(xmin_global, f(xmin_global), '^', label='global minima')
plt.plot(xmin_local, f(xmin_local), '^', label='local minima')
plt.plot(root1, f(root1), 'o', label='root1')
plt.plot(root2, f(root2), 'o', label='root2')
plt.plot(x, f2(x, params[0], params[1]), '--', c='b', label="curve fit result")
plt.legend()
plt.show()

运行结果:
Optimization terminated successfully.
Current function value: -7.945823
Iterations: 5
Function evaluations: 24
Gradient evaluations: 8
[-1.30644003]
[ 3.83746663]
[-1.30641113]
3.8374671195
[ 0.]
[-2.47948183]
[ 1.0089413 9.92366871]


参考:
http://blog.chinaunix.net/uid-21633169-id-4437868.html
http://www.cnblogs.com/ttrrpp/p/6822214.html


基本上把python用到的数学库简单的过了一遍,相信之后遇到一些函数库也不会那么陌生了。接下去就开始真正的学习机器学习算法了。

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值