本次用到了鸢尾花数据集
首先导入数据集
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 |
---|---|---|---|
花萼长度 | 花萼宽度 | 花瓣长度 | 花瓣宽度 |

生成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打开后如下图所示:
导入数据
求花萼的均值、中位数、标准差
归一化花萼长度
求花萼长度第5和第95百分位数
把数据集中20个随机位置改为np.nan
查找缺失值的个数和位置
筛选花萼长度 < 5.0 且花瓣长度 > 1.5 的行
选择没有任何 nan 值的 iris_data行
计算 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)=n1i=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)=n1i=0∑n(xi−x^)(yi−y)^
首先通过定义来自己计算一下:
使用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函数一致:
找出iris_data是否有任何缺失值
在numpy数组中将所有出现的nan替换为0
找出鸢尾属植物物种中的唯一值和唯一值出现的数量
将 iris_data 的花瓣长度(第3列)以形成分类变量的形式显示
定义:Less than 3 --> ‘small’;3-5 --> ‘medium’;’>=5 --> ‘large’
在 iris_data 中创建一个新列
其中 volume 是 (pi * petallength * sepallength ^ 2)/ 3
随机生成鸢尾属植物的种类
使得Iris-setosa的数量是Iris-versicolor和Iris-virginica数量的两倍