一. 矩阵操作函数库(Numpy)
1.np函数运算
import time
import math
import numpy as np
x = [i*0.001 for i in range(1000)]
start = time.clock()
for i,t in enumerate(x):
x[i]=math.sin(t)
print(‘math.sin运行时间:’,time.clock()-start)
x=[i*0.001 for i in range(1000)]
x=np.array(x)
start = time.clock()
np.sin(x)
print(‘numpy.sin运行时间:’,time.clock()-start)
numpy.sin比math.sin快得多
2.矩阵运算
Numpy对于多维数组运算,默认情况下不使用矩阵运算,需调用相应函数。在Numpy中同时存在ndarray和matrix对象,不推荐在复杂程序中用matrix
np.dot计算矩阵乘积。矩阵更高级运算在Numpy的linalg(线型代数)中:inv计算逆矩阵,solve()求解多元一次方程组。
a = np.random.rand(10,10)
b = np.random.rand(10)
x = np.linalg.solve(a,b)
z=np.sum(np.abs(np.dot(a,x)-b))
print(z)
二.科学计算核心包(Scipy)
Scipy是科学计算程序的核心包,在Numpy基础上增加了众多数学、科学及工程计算中常用的库函数。如线性代数、常微分方程求加、信 /图像处理、稀疏矩阵。
1.最小二乘法(最小平方法)
最小二乘拟合属于优化问题。如f(x)=kx+b,k,b就是要确定的值,将这些参数用p表示,寻找参数p使得S函数最小
eg.使用最小二乘法进行正弦函数拟合
import numpy as np
import args
import matplotlib.pyplot as plt
from numpy import pi
from scipy.optimize import leastsq
def func(x,p):
A,k,theta = p
return A*np.sin(2*k*np.pi*x+theta)
def residuals(p,y,x): #定义误差函数
return y-func(x,p)
#定义训练数据
x=np.linspace(0,-2*np.pi,100)
A,k,theta=10,0.34,np.pi/6
y1=func(x,[A,k,theta]) #100个真实数据
y2=y1+2*np.random.randn(len(x)) #randn()产生一个标准正态分布的随机数,所以y是100个噪声数据
#随机给出3个参数初始值
p0=[7,0.2,0]
#曲线拟合
plsq=leastsq(residuals,p0,args=(y2,x))
#绘制结果图形
print(‘真实参数:’,[A,k,theta])
print(‘拟合参数:’,plsq[0]) #plsq[0]为实验数据拟合参数
plt.plot(x,y1,label=’real data’)
plt.plot(x,y2,label=’data having noise’)
plt.plot(x,func(x,plsq[0]),label=’fitting data’)
plt.legend()
plt.show()
out:
真实参数: [10, 0.34, 0.5235987755982988]
拟合参数: [-9.80190362 0.34138626 3.73679094]
eg.2
plt.figure(2)
plt.plot(x,z,’b–‘,label=’$cos(x^2)$’) #蓝色虚线表示
plt.legend()
plt.show()
then,创建一个3行2列共6个轴的图形,通过axisbg参数给每个轴(子图)设置不同背景
for idx,color in enumerate(‘rgbyck’):
plt.subplot(320+idx+1,axisbg=color)
plt.show()
4.中文显示问题
import numpy as np
import matplotlib.pyplot as plt
#手动添加中文字体名称
from pylab import *
mpl.rcParams[‘font.sans-serif’]=[‘SimHei’]
#手动加负
plt.rcParams[‘axes.unicode_minus’]=False_
x=np.arange(0.0,5,0.01)
y=np.cos(2*np.pi*x)
plt.plot(x,y,label=’$sin(x)$’,color=’red’,linewidth=2)
plt.xlabel(‘时间(秒)’)
plt.ylabel(‘电压’)
plt.title(‘正弦波’)
plt.legend()
plt.show()
调用数据:
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.target) #标签:0(setosa),1(versicolor),2(virginica)
print(iris.target_names) #标签名称
print(iris.data.shape) #150个样本,每个样本4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)
out:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 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 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 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
[‘setosa’ ‘versicolor’ ‘virginica’]
(150, 4)
3.Scikit-learn的数据集划分
训练集:用来估计模型
验证集:确定 络结构or控制模型复杂程度的参数
测试集:检验最终选择最优模型的性能
(1)train_test_split划分数据集
sklearn.model_selection函数,该函数的train_test_split是交叉验证中常用函数。其作用是从样本中选取train_data 和 test_data
形式:X_train,X_test,y_train,y_test = train_test_split(train_data,train_target,test_size=0.4,random_state=0)
train_data:数据集
train_target:目标类别集
test_size:样本占比,即测试集占原数据的比重。如果是整数,就是样本的数量
random_state:随机数种子,即该组随机数编 。种子相同,随机数相同。
X_train:生成训练集的特征
X_test:生成测试集的特征
y_train:生成训练集标签
y_test :生成测试集标签
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
iris=load_iris()
iris.data.shape,iris.target.shape
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.4,random_state=0)
print(X_train.shape,y_train.shape,X_test.shape,y_test.shape)
print(iris.data[:5])
print(X_train[:5])
out:
(90, 4) (90,) (60, 4) (60,)
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
[[6. 3.4 4.5 1.6]
[4.8 3.1 1.6 0.2]
[5.8 2.7 5.1 1.9]
[5.6 2.7 4.2 1.3]
[5.6 2.9 3.6 1.3]]
(2)对数据集进行指定次数的交叉验证,并评测每次验证效果
使用cross_val_score(方法,数据集,目标类别集,cv=5)验证
from sklearn.model_selection import cross_val_score
from sklearn import svm
import numpy
clf = svm.SVC(kernel=’linear’,C=1)
”’C: float,optional(default=1.0)
错误项的惩罚参数C
Kernel:string,optional(default=’rbf’)
指定在算法中使用的内核类型。 它必须是’linear’,’poly’,’rbf’,’sigmoid’,’precomputed’或者callable之一。 如果没有给出,将使用’rbf’。 如果给出可调用,则它用于从数据矩阵预先计算内核矩阵。该矩阵应该是一个形状数组(n_samples,n_samples)。
”’
scores = cross_val_score(clf,iris.data,iris.target,cv=5) #5折(将数据集通过5次分割)交叉验证,当cv为int类型,默认KFold or StratifiedKFold进行数据集打乱
print(scores)
print(scores.mean())
out:
[0.96666667 1. 0.96666667 0.96666667 1. ]
0.980000000000000009
除上交叉验证外,可对交叉验证方式进行指定(cv),如验证次数、训练集测试集划分比例等
eg.使用ShuffleSplit将数据集打乱
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn import svm
iris=load_iris()
clf = svm.SVC(kernel=’linear’,C=1)
cv = ShuffleSplit(n_splits=3,test_size=0.3,random_state=0) #数据集分3次,每次训练集大小占原数据70%
scores=cross_val_score(clf,iris.data,iris.target,cv=cv)
print(scores)
out:
[0.97777778 0.97777778 1. ]
(3)k折交叉验证( KFold(n_splits=…) )
通过k次分割,将数据集划分成k份,使所有数据集既在训练集出现过,又在测试集出现过。当然,每次分割中不会有重叠,类似无放回抽样。
from sklearn.model_selection import KFold
import numpy as np
X = [‘a’,’b’,’c’,’d’,’e’,’f’]
kf = KFold(n_splits=2) #2折交叉验证
for train,test in kf.split(X): #KFold.split()返回索引
print(train,test)
print(np.array(X)[train], np.array(X)[test])
print(‘n’)
out:
[3 4 5] [0 1 2]
[‘d’ ‘e’ ‘f’] [‘a’ ‘b’ ‘c’]
[0 1 2] [3 4 5]
[‘a’ ‘b’ ‘c’] [‘d’ ‘e’ ‘f’]
(4)LeaveOneOut验证
留一法是KFold的一个特例。一般用于数据集数目较少时。将N个样本打乱,均匀分成N份,轮流选择其中N-1份训练,剩余一份做验证,计算预测误差平方和,最终N次误差平方和做平均 作为选择最优模型结构的依据。
from sklearn.model_selection import LeaveOneOut
import numpy as np
X = [‘a’,’b’,’c’,’d’,’e’,’f’]
loo = LeaveOneOut()
for train,test in loo.split(X):
print(train,test)
print(np.array(X)[train], np.array(X)[test])
out:
[1 2 3 4 5] [0]
[‘b’ ‘c’ ‘d’ ‘e’ ‘f’] [‘a’]
[0 2 3 4 5] [1]
[‘a’ ‘c’ ‘d’ ‘e’ ‘f’] [‘b’]
[0 1 3 4 5] [2]
[‘a’ ‘b’ ‘d’ ‘e’ ‘f’] [‘c’]
[0 1 2 4 5] [3]
[‘a’ ‘b’ ‘c’ ‘e’ ‘f’] [‘d’]
[0 1 2 3 5] [4]
[‘a’ ‘b’ ‘c’ ‘d’ ‘f’] [‘e’]
[0 1 2 3 4] [5]
[‘a’ ‘b’ ‘c’ ‘d’ ‘e’] [‘f’]
如上代码,可以看出数据集个数为6个,每次训练集为5个数据,验证集只有1个数据,反复拆分。
将代码修改成KFold特例,即k=数据集个数N
from sklearn.model_selection import KFold
import numpy as np
X = [‘a’,’b’,’c’,’d’,’e’,’f’]
kf = KFold(n_splits=len(X))
for train,test in kf.split(X):
print(train,test)
print(np.array(X)[train], np.array(X)[test])
六.统计建模包(StatsModels)
StatsModels模块:一般线性模型、离散选择模型、时间序列分析、一系列描述统计学、非参数检验。
七.深度学习框架(TensorFlow)
TensorFlow是Google基于DistBrief进行研发的第二代人工智能学习系统,具备更好的灵活性和可延展性。
TensorFlow支持CNN、RNN、LSTM算法,这都是目前最流行的深度神经 络模型。
应用:语音识别、自然语言理解、计算机视觉、广告。
特点:
(1)高度灵活性:TensorFlow不是一个严格第‘神经 络库’,只要可以将计算表示为一个数据流图,就可使用TensorFlow。
(2)真正可移植性:TensorFlow在CPU 和GPU上运行,可运行在台式机、服务器、手机移动设备
(3)将科研和产品联系在一起:避免大量代码重写工作
(4)自动求微分功能:有利于基于梯度的机器学习算法
(5)多语言支持:有一个C++界面,也有Python界面来构建和执行Graphs
(6)性能最优化:TensorFlow支持线程、队列、异步操作等,将硬件的计算潜能全部发挥出来
import tensorflow as tf
sess = tf.Session() #tf.Session()创建一个会话,当上下文管理器退出时会话关闭和资源释放自动完成。
hello = tf.constant(‘hello,TensorFlow’) #tf.constant()创建一个变量
print(sess.run(hello))
out:
b’hello,TensorFlow’
再测试一个基本数学例子
import tensorflow as tf
sess = tf.Session()
a = tf.constant(10)
b = tf.constant(20)
print(sess.run(a+b))
out:
30
文章知识点与官方知识档案匹配,可进一步学习相关知识OpenCV技能树视频分析光流11526 人正在系统学习中 相关资源:segtool.tar.gz_matlab时频脊线_小波脊线提取_脊提取_脊线_脊线…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!