以下列出了本人是学习线性回归算法时,所掌握的一些编程技巧
1.矩阵相减
matrix A是n*m,B是1*m
则A-B 表示A中的每行中对应列元素都减去B对应的列元素
2.对样本数据标准化处理
mean(A, 0) # 表示对A中的每一列取平均值,最后得到1*m的矩阵
var(A, 0) #表示对A中的每一列取方差,最后得到1*m的矩阵
所谓数据标准化:
首先对列数据求出期望(平均值)和方差,然后每列中的元素值减去均值,再将差值除以方差,得到标准化数据。
标准化数据的意义在于:表示对每个特征值的数据同等重要。
3.利用zeros和ones构建多维矩阵
wArr = zeros((n, m))
wArr = ones((n, m))
这两个方法的使用重点是,输入参数的数据类型为元数据。而外面的括号只是函数输入参数时的基本属性。函数调用,参数当然需要用括号括起来啊。
4.list转array
list只是基本数据结构,并没有过多的操作(如:shape,argsort等),这个时候,可以将list转化numpy中的array,继而转化成mat(或matrix)
5.range和arange
循环的基本结构是for ... in ...
range:产生一个python的基本类型list
arange:产生一个numpy的数组array,继而可通过reshape转化成自己想要的n*m维行列式数组,如reshape((4,2)),注意参数都需要元数据,因为不需要改变数据啊。
6.对n*n的矩阵(即行列式)求解行列式值:
若linalg.det(A) == 0.0,则数据矩阵A为奇异矩阵,不能够求解逆矩阵,因为有逆矩阵的充要条件为矩阵非奇异(满秩)。
小注:
algebra发音为:英 /ˈældʒɪbrə/ 美 /ˈældʒɪbrə/ ;
7.python中参数的传递方式
是引用传递,所以针对mat和array时,若是函数中的操作会改变参数的值,那就需要copy一份出来
一般整数(浮点数)有无穷大和无穷小,inf表示无穷大,那么-inf就是无穷小,float(inf)和float(-inf)
8.numpy.insert
numpy.insert可以有三个参数(arr,obj,values),也可以有4个参数(arr,obj,valuse,axis)
arr:是一个数组,可以是一维或多维,在arr的基础上插入元素
obj:元素插入的位置,从0开始
values:需要插入的数值,需要数组形式,如ones((1,77))
axis:没有时,对arr进行flatten处理,若为1,表示列的方向插入,如下所示:
>>> a = np.array([[1, 1], [2, 2], [3, 3]]) >>> a array([[1, 1], [2, 2], [3, 3]]) >>> np.insert(a, 1, 5) array([1, 5, 1, ..., 2, 3, 3]) >>> np.insert(a, 1, 5, axis=1) array([[1, 5, 1], [2, 5, 2], [3, 5, 3]])
9. nonzero
nonzero(a),表示如下意思:
1.只有a中非零元素才会有索引值,那些零值元素没有索引值;
2.返回的索引值数组是一个2维元数组,该tuple数组中包含一维的array数组。其中,一维array向量的个数与a的维数是一致的;
3.索引值数组的每一个array均是从一个维度上来描述其索引值。比如,如果a是一个二维数组,则索引值数组有两个array,第一个array从行维度来描述索引值;第二个array从列维度来描述索引值;
4.transpose(np.nonzero(x))函数能够描述出每一个非零元素在不同维度的索引值。
5.通过a[nonzero(a)]得到所有a中的非零值;
举例:
x = array([[1,0,0], [0,2,0], [1,1,0]]) print(nonzero(x)) -------------------- 结果: (array([0, 1, 2, 2], dtype=int64), array([0, 1, 0, 1], dtype=int64))
从这里可以nonzero只获取非零元素的索引值,若是二维数据的话,结果是返回二维数据中对应索引值,
第一个数组表示行索引,第二个数组表示列索引。
举例二:
testMat = mat(eye(4)) print(testMat) testMat print(transpose(nonzero(testMat))) print(testMat[nonzero(testMat)]) ------------------------------------------------------- 结果: [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]] [[0 0] [1 1] [2 2] [3 3]] [[1. 1. 1. 1.]]
从上述代码中可以看到:transpose(nonzero(testMat))获得了不等于0的元素索引值(由于是二维的,所以会有行列两个数)
而testMat[nonzero(testMat)]则是矩阵通过索引获取子矩阵,从而得到了不等于0的元素。所有的元素构成1*n的矩阵。
小结:就会获取数组a中非零元素的索引值,其实就是很简单啊
10.mean
mean() 函数定义:
numpy.mean(a, axis, dtype, out,keepdims )
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
- axis 不设置值,对 m*n 个数求均值,返回一个实数
- axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
- axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
参考:https://blog.csdn.net/lilong117194/article/details/78283358
11.numpy中std、var和cov
var:为方差,均方差,也可以先计算均值,然后计算每个差值再平方,最后相加并除以数据个数,即为均方差。
std:为标准方差,就是var的平方根
cov:协方差,和var类似,但是分母是N-1