从线性回归中学习到的编程技巧

以下列出了本人是学习线性回归算法时,所掌握的一些编程技巧

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为奇异矩阵,不能够求解逆矩阵,因为有逆矩阵的充要条件为矩阵非奇异(满秩)。

小注:

linear algebra表示线性代码;

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

原文地址:https://www.cnblogs.com/gwzz/p/13559205.html