基於jupyter notebook的python編程-----機器學習中的線性分類器及相應判定方法(鳶尾花數據集的分類可視化)


在進行人工智能機器學習的過程中,我們肯定會遇到對各種各種數據集的處理,然後進行分類;其中,分類是一個非常複雜而且十分難的一個過程,特別是需要對分類算法很好的瞭解掌握,我們才能進行精確的分類,看似處理的數據,實則我們處理的是未來人工智能深度學習的算法。
本次博客,林君學長將帶大家通過舉例鳶尾花數據集的分類可視化瞭解線性分類器,從而理解機器學習中的分類算法

一、機器學習中線性分類器的定義

在機器學習領域,分類的目標是指將具有相似特徵的對象聚集。而一個線性分類器則透過特徵的線性組合來做出分類決定,以達到此種目的。對象的特徵通常被描述爲特徵值,而在向量中則描述爲特徵向量。

1、什麼是線性分類器?

在這裏插入圖片描述
具體可參考右方鏈接的資料:線性分類器的定義

2、線性分類器的實現原理

在這裏插入圖片描述

3、設計線性分類器的主要步驟

1)、收集一組具有類別標誌的樣本X={x1,x2,…,xN}
2)、按需要確定一準則函數J,其值反映分類器的性能,其極值解對應於“最好”的決策
3)、用最優化技術求準則函數J的極值解w* 和w0* ,從而確定判別函數,完成分類器設計
這樣就可以得到線性判別函數g(x)=wT+w0或g(x)=a*Ty
在這裏插入圖片描述
4)、對於未知樣本x,計算g(x),判斷其類別

4、Fisher線性判別

1)、Fisher線性判別函數是研究線性判別函數中最有影響的方法之一。對線性判別函數的研究就是從R.A.Fisher在1936年發表的論文開始的
在這裏插入圖片描述
由於篇幅原因,該博客就不注重介紹Fisher線性判別的定義及步驟,大家可以參考右邊鏈接進行了解:Fisher線性判別

接下來,我們就通過例題來進行線性分類器的設計,瞭解到底如何通過代碼,對線性規劃問題進行合理的分類,以鳶尾花數據集的分類可視化爲例

二、例題1–鳶尾花數據集的分類可視化及預測

鳶尾花數據集作爲入門經典數據集。Iris數據集是常用的分類實驗數據集,由Fisher,1936收集整理。Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。數據集包含150個數據集,分爲3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。
在三個類別中,其中有一個類別和其他兩個類別是線性可分的。並且,在sklearn中已內置了該數據集,小夥伴們可在文件中查找自己的python安裝路徑,然後在sklearn包中找到該數據集!

1、準備鳶尾花數據集

1)、查找iris.data數據集的位置
一般來說,首先查找自己的python路徑,在python的安裝路徑中查找庫,然後找到包,最後在sklearn目錄下的data中查詢,如下所示:

D:\xxx\Lib\site-packages\sklearn\datasets\data

xxx代表python的安裝路徑
在這裏插入圖片描述

2)、加入該項文件夾中沒有該數據集,那麼我們可以通過以下鏈接進行下載:
http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

下載後是iris.data文件,然後放在上面路徑中遍可以,當然也可以不放,放進去是方便數據集的保管!
在這裏插入圖片描述

2、打開jupyter進行python環境創建

1)、打開Windows終端命令行,輸入jupyter notebook,打開我們的jupyter工具,如下所示:
在這裏插入圖片描述
2)、在jupyter的web網頁中創建python文件,如下所示:
在這裏插入圖片描述
3)、現在就可以在jupyter的代碼行裏面輸入我們的代碼啦!

3、編寫鳶尾花數據集的分類可視化代碼

1)、導入本次實驗需要的庫

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import preprocessing
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

2)、對各個變量進行賦值,取出數據集

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import preprocessing
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
df = pd.read_csv('D:xxx\Lib\site-packages\sklearn\datasets\data\iris.data', header=0)
x = df.values[:, :-1]
y = df.values[:, -1]
le = preprocessing.LabelEncoder()
le.fit(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'])
y = le.transform(y)
  • xxx代表python的安裝路徑,當然了,如果下載到別的地方的路徑填寫對應的路徑就好了
  • pd.read_csv(path, header=0),header :指定行數用來作爲列名,數據開始行數。如果文件中沒有列名,則默認爲0【第一行數據】,否則設置爲None。
  • sklearn.preprocessing.LabelEncoder():標準化標籤,將標籤值統一轉換成range(標籤值個數-1)範圍內,例如[“paris”, “paris”, “tokyo”, “amsterdam”]
  • le.fit([‘Iris-setosa’, ‘Iris-versicolor’, ‘Iris-virginica’])含義爲將標籤集餵給le標籤處理器,y = le.transform(y)對y進行轉化

3)、構建線性模型
用兩個特徵構建logistic迴歸模型

x = x[:, :2] 
x = StandardScaler().fit_transform(x)
lr = LogisticRegression()   # Logistic迴歸模型
lr.fit(x, y.ravel())        # 根據數據[x,y],計算迴歸參數

StandardScaler----計算訓練集的平均值和標準差,以便測試數據集使用相同的變換。即fit_transform()的作用就是先擬合數據,然後轉化它將其轉化爲標準形式。調用fit_transform(),其實找到了均值μ和方差σ^2,即已經找到了轉換規則,把這個規則利用在訓練集上,同樣,可以直接將其運用到測試集上(甚至交叉驗證集)。

4)、鳶尾花數據集的分類可視化

我們可以在所選特徵的範圍內,從最大值到最小值構建一系列的數據,使得它能覆蓋整個的特徵數據範圍,然後預測這些值所屬的分類,並給它們所在的區域上色,這樣我們就能夠清楚的看到模型每個分類的區域了

N, M = 500, 500     # 橫縱各採樣多少個值
x1_min, x1_max = x[:, 0].min(), x[:, 0].max()   # 第0列的範圍
x2_min, x2_max = x[:, 1].min(), x[:, 1].max()   # 第1列的範圍
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2)                    # 生成網格採樣點
x_test = np.stack((x1.flat, x2.flat), axis=1)   # 測試點
cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
y_hat = lr.predict(x_test)       # 預測值
y_hat = y_hat.reshape(x1.shape)                 # 使之與輸入的形狀相同
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)     # 預測值的顯示
plt.scatter(x[:, 0], x[:, 1], c=y.ravel(), edgecolors='k', s=50, cmap=cm_dark)    
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid()
plt.savefig('2.png')
plt.show()
  • np.meshgrid()函數常用於生成網格數據,多用於繪製三維圖形
  • mpl.colors.ListedColormap([’#77E0A0’, ‘#FF8080’, ‘#A0A0FF’])生成一個顏色的列表
  • plt.pcolormesh(x1, x2, y_hat, cmap=cm_light) 根據顏色列表中的值,給傳入的座標進行繪圖

5)、計算該線性分類器模型的準確率

y_hat = lr.predict(x)
y = y.reshape(-1)
result = y_hat == y
acc = np.mean(result)
print('準確度: %.2f%%' % (100 * acc))

6)、運行結果
在這裏插入圖片描述

可以看到,鳶尾花數據集共分爲三類,並且不同的數據分佈在不同的類別之中,從而達到線性分類器的效果;由於我們使用的是兩個特徵進行數據集的分類,所以分類的準確率並不是高,只有百分之81.21

4、鳶尾花數據集的分類可視化的整體python代碼

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import preprocessing
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
df = pd.read_csv('D:\\Python\python1\Lib\site-packages\sklearn\datasets\data\iris.data', header=0)
x = df.values[:, :-1]
y = df.values[:, -1]
le = preprocessing.LabelEncoder()
le.fit(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'])
y = le.transform(y)
x = x[:, :2] 
x = StandardScaler().fit_transform(x)
lr = LogisticRegression()   # Logistic迴歸模型
lr.fit(x, y.ravel())  
N, M = 500, 500     # 橫縱各採樣多少個值
x1_min, x1_max = x[:, 0].min(), x[:, 0].max()   # 第0列的範圍
x2_min, x2_max = x[:, 1].min(), x[:, 1].max()   # 第1列的範圍
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2)                    # 生成網格採樣點
x_test = np.stack((x1.flat, x2.flat), axis=1)   # 測試點
cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
y_hat = lr.predict(x_test)       # 預測值
y_hat = y_hat.reshape(x1.shape)                 # 使之與輸入的形狀相同
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)     # 預測值的顯示
plt.scatter(x[:, 0], x[:, 1], c=y.ravel(), edgecolors='k', s=50, cmap=cm_dark)    
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid()
plt.savefig('2.png')
plt.show()
y_hat = lr.predict(x)
y = y.reshape(-1)
result = y_hat == y
acc = np.mean(result)
print('準確度: %.2f%%' % (100 * acc))

以上就是鳶尾花數據集的分類可視化及預測的整個例題的講解過程,過程較爲簡單,難的是理解相關代碼的意思,其實主要就是線性分類器的含義而來!

接下來,我們將通過如下例題2進行模式的判定,分類,一起看如下步驟吧!

三、例題2–判定一下模式屬於哪類?

例2:假如有一個三類問題,其判別式爲:
d1(x)=x1+x2+1d_1(x)=-x_1+x_2+1
d2(x)=x1+x24d_2(x)=x_1+x_2-4
d3(x)=x2+1d_3(x)=-x_2+1
現有一模式爲x=[7,5]tx=[7,5]^t,該判定應屬於哪類?

1、將x=[7,5]tx=[7,5]^t代入上述判別函數

1)、將X=[7,5]tX=[7,5]^t分別代入上述判別函數中,得:
d1(x)=7+5+1=1:d1(x)<0d_1(x)=-7+5+1=-1:故d_1(x)<0
d2(x)=7+54=8:d2(x)>0d_2(x)=7+5-4=8 :故d_2(x)>0
d3(x)=5+1=4:d3(x)<0d_3(x)=-5+1=-4 :故d_3(x)<0

2、該題三類問題判別原理

1)該題三類問題判別原理如下:
對任意di(x)>0,Xωid_i(x)>0,則X\in\omega_i,其他情況,判定失敗
2)、上述結果判定
因爲 d2(x)>0,d1(x)<0d3(x)<0,Xω2d_2(x)>0,而d_1(x)<0和d_3(x)<0,從而X\in\omega_2

3、通過python代碼的判定如下所示

1)、python代碼如下所示:

#三類問題的判別
def determine(x1,x2):#x1,x2表示模式x=[7,5]^t
    d1x=d1[0]*x1+d1[1]*x2+d1[1]
    d2x=d2[0]*x1+d2[1]*x2+d2[1]
    d3x=d3[0]*x1+d1[1]*x2+d3[1]
    if d1x>0:
        print("該判定結果:X∈ω1")
    elif d2x>0:
        print("該判定結果:X∈ω2")
    elif d3x>0:
        print("該判定結果:X∈ω3")
    else:
        print("分類失敗")
d1=[-1,1,1]#表示d1的係數和截距
d2=[1,1,-4]#表示d2的係數和截距
d3=[-1,1,0]#表示d3的係數和截距
determine(7,5)

2)、運行結果如下所示:
在這裏插入圖片描述
3)、假設模式爲x=[0,1]tx=[0,-1]^t則分類失敗,如下所示:
在這裏插入圖片描述

以上就是本次博客的全部內容啦,希望通過對本次博客的閱讀,可以幫助小夥伴理解如何對不同類的問題進行對應的判斷哦,同時,希望大家掌握判定的方法,這樣纔是解決幾類問題判定的關鍵因素!
遇到問題的小夥伴記得留言評論哦,林君學長看到會爲大家進行解答的,這個學長不太冷!

陳一月的又一天編程歲月^ _ ^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章