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


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

    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

  • 相关阅读:
    IDEA下Maven的pom文件导入依赖出现Auto build completed with errors
    org.apache.jasper.JasperException: java.lang.NullPointerException
    Eclipse下导入web项目(Some projects cannot be imported because they already exist in the workspace)
    JS中构造函数的方法定义在原型对象里
    JS变量赋值
    JDBC以及连接池连接MySQL出现时区错误问题
    chrome中如何截取整个网页
    java中final、super、static关键字的使用
    初识less
    根据当前时间显示问候语
  • 原文地址:https://www.cnblogs.com/gwzz/p/13559205.html
Copyright © 2020-2023  润新知