天天看点

Task02:Numpy常用函数

本次用到了鸢尾花数据集

首先导入数据集

from sklearn import datasets

iris = datasets.load_iris()
print(dir(iris))
print(iris.feature_names)
           

Out:

['DESCR', 'data', 'feature_names', 'filename', 'frame', 'target', 'target_names']
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
           

翻译一下:

sepal length sepal width petal length petal width
花萼长度 花萼宽度 花瓣长度 花瓣宽度
Task02:Numpy常用函数

生成csv文件

为了和教程中的学习方式尽量贴切,生成一个csv文件。

可直接从群文件下载生成好的iris.csv文件

import numpy as np
from sklearn import datasets


iris = datasets.load_iris()
data = np.hstack((iris.data, iris.target_names[iris.target][:, None]))
cols = list(iris.feature_names)
cols.append('species')

data = np.vstack((np.array(cols)[None, :], data))

np.savetxt('E:/Data/iris.csv', data, fmt='%s',
           delimiter=',')
           

用excel打开后如下图所示:

Task02:Numpy常用函数

导入数据

Task02:Numpy常用函数

求花萼的均值、中位数、标准差

Task02:Numpy常用函数
Task02:Numpy常用函数

归一化花萼长度

Task02:Numpy常用函数
Task02:Numpy常用函数
Task02:Numpy常用函数

求花萼长度第5和第95百分位数

Task02:Numpy常用函数

把数据集中20个随机位置改为np.nan

Task02:Numpy常用函数

查找缺失值的个数和位置

Task02:Numpy常用函数

筛选花萼长度 < 5.0 且花瓣长度 > 1.5 的行

Task02:Numpy常用函数

选择没有任何 nan 值的 iris_data行

Task02:Numpy常用函数
Task02:Numpy常用函数

计算 iris_data 中sepalLength(第1列)和petalLength(第3列)之间的相关系数

相关系数的定义:

r ( X , Y ) = C o v ( X , Y ) D ( X ) D ( Y ) r(X, Y) = \frac{Cov(X, Y)}{\sqrt{D(X) D(Y)}} r(X,Y)=D(X)D(Y)

​Cov(X,Y)​

方差的定义:

D ( X ) = E ( X − E ( X ) ) 2 D(X) = E(X - E(X))^2 D(X)=E(X−E(X))2

D ( X ) = 1 n ∑ i = 0 n ( x i − x ^ ) 2 D(X) = \frac{1}{n}\sum_{i=0}^{n} (x_i - \hat{x})^2 D(X)=n1​i=0∑n​(xi​−x^)2

协方差的定义:

C o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] Cov(X, Y) = E[(X - E(X))(Y - E(Y))] Cov(X,Y)=E[(X−E(X))(Y−E(Y))]

C o v ( x , y ) = 1 n ∑ i = 0 n ( x i − x ^ ) ( y i − y ) ^ Cov(x, y) = \frac{1}{n} \sum_{i=0}^{n} (x_i - \hat{x})(y_i - \hat{y)} Cov(x,y)=n1​i=0∑n​(xi​−x^)(yi​−y)^​

首先通过定义来自己计算一下:

Task02:Numpy常用函数

使用Numpy现成的函数:

Task02:Numpy常用函数

如何计算n个向量间的相关系数矩阵?

化简上面的公式得:

r ( x , y ) = ∑ i = 0 n ( x i − x ^ ) ( y i − y ^ ) ∑ j = 0 n ( x j − x ^ ) ∑ k = 0 n ( y k − y ^ ) r(x, y) = \frac{ \sum_{i=0}^{n} (x_i - \hat{x}) (y_i - \hat{y}) }{ \sqrt{\sum_{j=0}^{n}(x_j-\hat{x})\sum_{k=0}^{n}(y_k-\hat{y})} } r(x,y)=∑j=0n​(xj​−x^)∑k=0n​(yk​−y^​)

​∑i=0n​(xi​−x^)(yi​−y^​)​

通过上面的公式,来写一个求n维向量之间相关系数矩阵的函数:

def corrcoef(ar, rowvar=True):
    """
    Parameters
    ----------
    ar : np.ndarray
        每一行表示代表一个变量,每一列代表对这些变量的一次观察.
    
    rowvar : Bollean
            是否反转行和列之间的关系

    Returns 
    -------
    相关系数矩阵

    """
    if rowvar:
        arT = ar.T
    else:
        ar, arT = ar.T, ar
    
    # 减去均值
    ar = ar - ar.mean(axis=1)[:, None]
    
    # 
    num = np.matmul(ar, arT)  # 分子
    tmp = np.power(ar, 2).sum(axis=1)
    den = np.sqrt(np.matmul(tmp[:, None], tmp[None, :]))  # 分母
    res = num / den
    
    return res
           

经检验,运行结果与np.corrcoef函数一致:

Task02:Numpy常用函数

找出iris_data是否有任何缺失值

Task02:Numpy常用函数

在numpy数组中将所有出现的nan替换为0

Task02:Numpy常用函数

找出鸢尾属植物物种中的唯一值和唯一值出现的数量

Task02:Numpy常用函数

将 iris_data 的花瓣长度(第3列)以形成分类变量的形式显示

定义:Less than 3 --> ‘small’;3-5 --> ‘medium’;’>=5 --> ‘large’

Task02:Numpy常用函数
Task02:Numpy常用函数
Task02:Numpy常用函数

在 iris_data 中创建一个新列

其中 volume 是 (pi * petallength * sepallength ^ 2)/ 3

Task02:Numpy常用函数

随机生成鸢尾属植物的种类

使得Iris-setosa的数量是Iris-versicolor和Iris-virginica数量的两倍

Task02:Numpy常用函数

END