python是统计软件吗_Python机器学习和分析工具

一. 矩阵操作函数库(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进行处理,非常感谢!

上一篇 2020年11月7日
下一篇 2020年11月7日

相关推荐