GuguMelon's Blog

今天所做之事勿候明天,自己所做之事勿候他人。

0%

毕设代码阅读笔记

常读常新。

一、所调用的库

argparse库

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。当然,Python 也有第三方的库可用于命令行解析,而且功能也更加强大,比如 docopt,Click。

logging库

这个模块为应用与库实现了灵活的事件日志系统的函数与类。

使用标准库提提供的 logging API 最主要的好处是,所有的 Python 模块都可能参与日志输出,包括你自己的日志消息和第三方模块的日志消息。

time和datetime库

在python文档中,time是归类在常规操作系统服务中,它提供的功能更加接近于操作系统层面。其所能表述的日期范围被限定在1970-2038之间,如果需要表述范围之外的日期,可能需要考虑使用datetime模块更好。

datetime比time高级了不少,可以理解为datetime基于time进行了封装,提供了更多实用的函数

pickle库

pickle模块实现了基本的数据序列化和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象

pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为”.pkl”),不能直接打开进行预览。而python的另一个序列化标准模块json,则是human-readable的,可以直接打开查看(例如在notepad++中查看)。

pickle模块有两类主要的接口,即序列化和反序列化。

numpy库

机器学习算法中大部分都是调用Numpy库来完成基础数值计算的。

数组的创建与使用

数组的创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> x=np.array([[1.0,0.0,0.0],[0.,1.,2.]]) #定义了一个二维数组,大小为(2,3)
>>> x
array([[1., 0., 0.],
[0., 1., 2.]])
>>> x.ndim #数组维度数
2
>>> x.shape #数组的维数,返回的格式(n,m),其中n为行数,m为列数
(2, 3)
>>> x.size #数组元素的总数
6
>>> x.dtype #数组元素类型
dtype('float64') #64位浮点型
>>> x.itemsize #每个元素占有的字节大小
8
>>> x.data #数组元素的缓冲区
<memory at 0x00000205227DAC18>

还有两种创建序列数组的函数arrange和linspace,和range函数类似,但它们都属于Numpy里面。
arange(a,b,c) 参数分别表示开始值,结束值,步长
linspace(a,b,c) 参数分别表示开始值,结束值,元素数量
还可以调用它们自身的方法reshape()指定形状

1
2
3
4
5
6
7
8
9
10
>>> arange(15).reshape(3,5)
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> arange(10,30,5)
array([10, 15, 20, 25])
>>> arange(0,2,0.3)
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
>>> linspace(0,2,9) # 0~2之间生成9个数字
array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])

还有创建概率分布的形式创建ndarray数组

1
2
3
4
5
6
7
#高斯分布
np.random.randn(shape)#生成对应形状(shape)的高斯分布
np.random.normal(loc, scale, size)#生成均值为loc,标准差为scale,形状(shape)为size的高斯分布

#均匀分布
np.random.rand(shape)#生成对应形状(shape)的均匀分布
np.random.uniform(low, high, size)#生成一个从[low, high)中随即采样的,样本数量为size的均匀分布

还有特殊数组

  • zeros数组:全零数组,元素全为零。
  • ones数组:全1数组,元素全为1。
  • empty数组:空数组,元素全近似为0。
数组的使用
数组的拷贝

数组拷贝分为浅拷贝和深拷贝,浅拷贝是复制数组的地址,如果对拷贝进行修改,则源数组也会被修改;而深拷贝是使用copy()函数,相当于重建了一个数组,修改不会对源数组产生影响

数组的合并与分割
1
2
3
4
5
6
7
8
9
10
np.hstack((a,b))#按行合并,要求a和b的行数相同
np.vstack((a,b))#按列合并,要求a和b的列数相同
np.c_[a,b]#用法如同np.hstack((a,b))
np.r_[a,b]#用法如同np.vstack((a,b))
np.concatenate((a,b), axis = 1)#按行合并,要求a和b的行数相同
np.concatenate((a,b), axis = 0)#按列合并,要求a和b的列数相同
#若concatenate函数不指定axis,则默认为0,默认按列合并;而一维数组只能按行合并

np.split(arr, n)#n要么是整数,要么是列表,用来进行划分,n为整数时必须是能均匀划分
np.array_split(arr, n)#类似上面的用法,但是可以不均等划分
数组降维
1
2
ravel()#返回一维数组,但是改变返回的一维数组内容后,原数组的值也会相应改变
flatten()#返回一维数组,改变返回的数组不影响原数组

矩阵相关

创建矩阵
1
2
3
4
5
6
7
8
9
10
>>> A=matrix('1.0 2.0;3.0 4.0')
>>> A
matrix([[1., 2.],
[3., 4.]])
>>> b=matrix([[1.0,2.0],[3.0,4.0]])
>>> b
matrix([[1., 2.],
[3., 4.]])
>>> type(A)
<class 'numpy.matrixlib.defmatrix.matrix'>
矩阵运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> A.T      #转置
matrix([[1., 3.],
[2., 4.]])
>>> x=matrix('5.0 7.0')
>>> y=x.T
>>> y
matrix([[5.],
[7.]])
>>> print(A*y) #矩阵乘法
[[19.]
[43.]]
>>> print(A.I) #逆矩阵
[[-2. 1. ]
[ 1.5 -0.5]]

LA相关函数

  • numpy.dot()
    此函数返回两个数组的点积。 对于二维向量,其等效于矩阵乘法。 对于一维数组,它是向量的内积。 对于 N 维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。
  • numpy.vdot()
    此函数返回两个向量的点积。 如果第一个参数是复数,那么它的共轭复数会用于计算。 如果参数id是多维数组,它会被展开。
  • numpy.inner()
    此函数返回一维数组的向量内积。 对于更高的维度,它返回最后一个轴上的和的乘积。
  • numpy.linalg.det()
    计算输入矩阵的行列式
  • numpy.linalg.solve()
    该函数给出了矩阵形式的线性方程的解
  • numpy.matmul()
    函数返回两个数组的矩阵乘积。当两个数组都是二维数组的时候,就是数学上的两个矩阵的乘积。

pytorch学习

clamp()和clamp_()的区别

clamp()函数的作用是将a数组的每个元素的值压缩到[min,max]之间,并返回一个新的张量
而clamp_()函数是直接在原张量上进行操作,而不是返回一个新的张量

二、机器学习常用函数

train_test_split()

train_test_split()函数是用来随机划分样本数据为训练集和测试集的,当然也可以人为的切片划分。

1
2
3
4
5
6
7
8
9
10
11
12

train_X,test_X,train_y,test_y = train_test_split(train_data,train_target,test_size=0.3,random_state=5)

参数解释:

train_data:待划分样本数据

train_target:待划分样本数据的结果(标签)

test_size:测试数据占样本数据的比例,若整数则样本数量

random_state:设置随机数种子,保证每次都是同一个随机数。若为0或不填,则每次得到数据都不一样