本次用到了鸢尾花資料集
首先導入資料集
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數量的兩倍