1. notes
  2. mathModel
Notebook

Scipy

Scipy特征

  1. 内置了图像处理, 优化,统计等等相关问题的子模块
  2. scipy 是Python科学计算环境的核心。 它被设计为利用 numpy 数组进行高效的运行。从这个角度来讲,scipy和numpy是密不可分的。

文件操作io

  1. 导包:from scipy import io as spio
  2. 保存mat格式文件spio.savemat("test.mat", {'a':a})
  3. 加载mat文件data = spio.loadmat("test.mat") 访问值:data[‘a’]–>相当于map
  4. 读取图片文件 导包:from scipy import misc 读取:data = misc.imread("123.png")

[注1]:与matplotlib中plt.imread('fname.png')类似

[注2]:执行misc.imread时可能提醒不存在这个模块,那就安装pillow的包

线性代数操作linalg

  1. 求行列式detres = linalg.det(a)
  2. 求逆矩阵invres = linalg.inv(a) 若是矩阵不可逆,则会抛异常LinAlgError: singular matrix
  3. 奇异值分解svdu,s,v = linalg.svd(a)

[注1]:s为a的特征值(一维),降序排列,

[注2]:a = usv’(需要将s转换一下才能相乘)

t = np.diag(s)
print u.dot(t).dot(v)

梯度下降优化算法

  1. fmin_bfgs
def f(x):
 return x**2-2*x
initial_x = 0
optimize.fmin_bfgs(f,initial_x)

[注]:initial_x为初始点(此方法可能会得到局部最小值)

  1. fmin()、fmin_cg等等方法

拟合(最小二乘法)

  1. curve_fit
#产生数据
def f(x):
 return x**2 + 10*np.sin(x)
xdata = np.linspace(-10, 10, num=20)
ydata = f(xdata)+np.random.randn(xdata.size)
plt.scatter(xdata, ydata, linewidths=3.0, 
 edgecolors="red")
#plt.show()
#拟合
def f2(x,a,b):
 return a*x**2 + b*np.sin(x)
guess = [2,2]
params, params_covariance = optimize.curve_fit(f2, xdata, ydata, guess)
#画出拟合的曲线
x1 = np.linspace(-10,10,256)
y1 = f2(x1,params[0],params[1])
plt.plot(x1,y1)
plt.show()

统计检验

  1. T-检验stats.ttest_ind

    a = np.random.normal(0, 1, size=10)
    b = np.random.normal(1, 1, size=10)
    print stats.ttest_ind(a, b)
    

    输出:(-2.6694785119868358, 0.015631342180817954) 后面的是概率p: 两个过程相同的概率。如果其值接近1,那么两个过程几乎可以确定是相同的,如果其值接近0,那么它们很可能拥有不同的均值。

插值

  1. 导入包:from scipy.interpolate import interp1d
#产生一些数据
x = np.linspace(0, 1, 10)
y = np.sin(2 * np.pi * x)
computed_time = np.linspace(0, 1, 50)
#线性插值
linear_interp = interp1d(x, y)
linear_results = linear_interp(computed_time)
#三次方插值
cubic_interp = interp1d(x, y, kind='cubic')
cubic_results = cubic_interp(computed_time)
#作图
plt.plot(x, y, 'o', ms=6, label='y')
plt.plot(computed_time, linear_results, label='linear interp')
plt.plot(computed_time, cubic_results, label='cubic interp')
plt.legend()
plt.show()

求解非线性方程组

  1. optimize中的fsolve
from scipy.optimize import fsolve
def func(x):
 x0,x1,x2 = x.tolist()
 return [5*x1-25,5*x0*x0-x1*x2,x2*x0-27]
initial_x = [1,1,1]
result = fsolve(func, initial_x)
print result

AltStyle によって変換されたページ (->オリジナル) /