日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器...

發(fā)布時(shí)間:2024/4/11 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

. 邏輯回歸

邏輯回歸(Logistic Regression)是用于處理因變量為分類變量的回歸問(wèn)題,常見(jiàn)的是二分類或二項(xiàng)分布問(wèn)題,也可以處理多分類問(wèn)題,它實(shí)際上是屬于一種分類方法。

概率p與因變量往往是非線性的,為了解決該類問(wèn)題,我們引入了logit變換,使得logit(p)與自變量之 間存在線性相關(guān)的關(guān)系,邏輯回歸模型定義如下:

1 #Sigmoid曲線:

2 importmatplotlib.pyplot as plt3 importnumpy as np4

5 defSigmoid(x):6 return 1.0 / (1.0 + np.exp(-x))7

8 x= np.arange(-10, 10, 0.1)9 h = Sigmoid(x) #Sigmoid函數(shù)

10 plt.plot(x, h)11 plt.axvline(0.0, color='k') #坐標(biāo)軸上加一條豎直的線(0位置)

12 plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')13 plt.axhline(y=0.5, ls='dotted', color='k') #在y=0.5的地方加上黑色虛線

14 plt.yticks([0.0, 0.5, 1.0]) #y軸標(biāo)度

15 plt.ylim(-0.1, 1.1) #y軸范圍

16 plt.show()

二、鳶尾花分類問(wèn)題的思路分析

(1)選擇使用LogisticRegression分類器,由于Iris數(shù)據(jù)集涉及到3個(gè)目標(biāo)分類問(wèn)題,而邏輯回歸模型是二分類模型,用于二分類問(wèn)題。因此,可以將其推廣為多項(xiàng)邏輯回歸模型(multi-nominal logistic regression model),用于多分類。

(2)根據(jù)多項(xiàng)邏輯回歸模型,編寫(xiě)代碼,輸入數(shù)據(jù)集,訓(xùn)練得到相應(yīng)參數(shù)并作出預(yù)測(cè)。

(3)對(duì)預(yù)測(cè)出的數(shù)據(jù)的分類結(jié)果和原始數(shù)據(jù)進(jìn)行可視化展示。

三、多項(xiàng)邏輯回歸模型的原理及推導(dǎo)過(guò)程

假設(shè)類別Y 的取值集合為 {1,2,...,K},那么多項(xiàng)邏輯回歸模型是:

其似然函數(shù)為:

其中,

為模型在輸入樣本

時(shí),將其判為類別k 的概率;

起到指示函數(shù)的作用,當(dāng)K 等于樣本

的標(biāo)簽類別時(shí)為1,其余均為0。

對(duì)似然函數(shù)取對(duì)數(shù),然后取負(fù),得到

(簡(jiǎn)記為:

),最終要訓(xùn)練出的模型參數(shù)要使得

的值取得最小。

的推導(dǎo)過(guò)程如下:

考慮到過(guò)擬合的發(fā)生,對(duì)

加上一個(gè)正則項(xiàng):

可以寫(xiě)成:

對(duì)

關(guān)于

求梯度,得到:

在上式中,第一項(xiàng)

可以看成是類別k的后驗(yàn)期望值,第二項(xiàng)

視為類別k 的先驗(yàn)期望值,第三項(xiàng)是正則化項(xiàng),用于緩解過(guò)擬合。

接下來(lái)使用梯度下降法對(duì)參數(shù)

進(jìn)行修正更新即可:

四、實(shí)現(xiàn)步驟

4.1 讀入數(shù)據(jù)文件

這里需要注意的是,在datas中取前兩列作為特征(為了后期的可視化畫(huà)圖更加直觀,故只取前兩列特征值向量進(jìn)行訓(xùn)練)

1 attributes=['SepalLength','SepalWidth','PetalLength','PetalWidth'] #鳶尾花的四個(gè)屬性名

2

3 datas=[]4 labels=[]5

6 #with open('IRIS_dataset.txt','r') as f:

7 #for line in f:

8 #linedata=line.split(',')

9 #datas.append(linedata[:-1]) #前4列是4個(gè)屬性的值

10 #labels.append(linedata[-1].replace('\n','')) #最后一列是類別

11

12 #讀入數(shù)據(jù)集的數(shù)據(jù):

13 data_file=open('IRIS_dataset.txt','r')14 for line indata_file.readlines():15 #print(line)

16 linedata = line.split(',')17 #datas.append(linedata[:-1]) # 前4列是4個(gè)屬性的值(誤判的樣本的個(gè)數(shù)為:7

18 datas.append(linedata[:-3]) #前2列是2個(gè)屬性的值(誤判的樣本的個(gè)數(shù)為:30

19 labels.append(linedata[-1].replace('\n', '')) #最后一列是類別

20

21 datas=np.array(datas)22 datas=datas.astype(float) #將二維的字符串?dāng)?shù)組轉(zhuǎn)換成浮點(diǎn)數(shù)數(shù)組

23 labels=np.array(labels)24 kinds=list(set(labels)) #3個(gè)類別的名字列表

4.2編寫(xiě)代碼實(shí)現(xiàn)LogisticRegression算法

1 #LogisticRegression算法,訓(xùn)練數(shù)據(jù),傳入?yún)?shù)為數(shù)據(jù)集(包括特征數(shù)據(jù)及標(biāo)簽數(shù)據(jù)),結(jié)果返回訓(xùn)練得到的參數(shù) W

2 defLogRegressionAlgorithm(datas,labels):3 kinds = list(set(labels)) #3個(gè)類別的名字列表

4 means=datas.mean(axis=0) #各個(gè)屬性的均值

5 stds=datas.std(axis=0) #各個(gè)屬性的標(biāo)準(zhǔn)差

6 N,M= datas.shape[0],datas.shape[1]+1 #N是樣本數(shù),M是參數(shù)向量的維

7 K=3 #k=3是類別數(shù)

8

9 data=np.ones((N,M))10 data[:,1:]=(datas-means)/stds #對(duì)原始數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)差歸一化

11

12 W=np.zeros((K-1,M)) #存儲(chǔ)參數(shù)矩陣

13 priorEs=np.array([1.0/N*np.sum(data[labels==kinds[i]],axis=0) for i in range(K-1)]) #各個(gè)屬性的先驗(yàn)期望值

14

15 liklist=[]16 for it in range(1000):17 lik=0 #當(dāng)前的對(duì)數(shù)似然函數(shù)值

18 for k in range(K-1): #似然函數(shù)值的第一部分

19 lik -= np.sum(np.dot(W[k],data[labels==kinds[k]].transpose()))20 lik +=1.0/N *np.sum(np.log(np.sum(np.exp(np.dot(W,data.transpose())),axis=0)+1)) #似然函數(shù)的第二部分

21 liklist.append(lik)22

23 wx=np.exp(np.dot(W,data.transpose()))24 probs=np.divide(wx,1+np.sum(wx,axis=0).transpose()) #K-1 *N的矩陣

25 posteriorEs=1.0/N*np.dot(probs,data) #各個(gè)屬性的后驗(yàn)期望值

26 gradients=posteriorEs - priorEs +1.0/100 *W #梯度,最后一項(xiàng)是高斯項(xiàng),防止過(guò)擬合

27 W -= gradients #對(duì)參數(shù)進(jìn)行修正

28 print("輸出W為:",W)29 return W

4.3 編寫(xiě)predict_fun()預(yù)測(cè)函數(shù)

根據(jù)訓(xùn)練得到的參數(shù)W和數(shù)據(jù)集,進(jìn)行預(yù)測(cè)。輸入?yún)?shù)為數(shù)據(jù)集和由LogisticRegression算法得到的參數(shù)W,返回值為預(yù)測(cè)的值。

1 #根據(jù)訓(xùn)練得到的參數(shù)W和數(shù)據(jù)集,進(jìn)行預(yù)測(cè)。輸入?yún)?shù)為數(shù)據(jù)集和由LogisticRegression算法得到的參數(shù)W,返回值為預(yù)測(cè)的值

2 defpredict_fun(datas,W):3 N, M = datas.shape[0], datas.shape[1] + 1 #N是樣本數(shù),M是參數(shù)向量的維

4 K = 3 #k=3是類別數(shù)

5 data =np.ones((N, M))6 means = datas.mean(axis=0) #各個(gè)屬性的均值

7 stds = datas.std(axis=0) #各個(gè)屬性的標(biāo)準(zhǔn)差

8 data[:, 1:] = (datas - means) / stds #對(duì)原始數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)差歸一化

9

10 #probM每行三個(gè)元素,分別表示data中對(duì)應(yīng)樣本被判給三個(gè)類別的概率

11 probM =np.ones((N, K))12 print("data.shape:", data.shape)13 print("datas.shape:", datas.shape)14 print("W.shape:", W.shape)15 print("probM.shape:", probM.shape)16 probM[:, :-1] =np.exp(np.dot(data, W.transpose()))17 probM /= np.array([np.sum(probM, axis=1)]).transpose() #得到概率

18

19 predict = np.argmax(probM, axis=1).astype(int) #取最大概率對(duì)應(yīng)的類別

20 print("輸出predict為:", predict)21 return predict

4.4繪制圖像

(1)確定坐標(biāo)軸范圍,x,y軸分別表示兩個(gè)特征

1 #1.確定坐標(biāo)軸范圍,x,y軸分別表示兩個(gè)特征

2 x1_min, x1_max = datas[:, 0].min(), datas[:, 0].max() #第0列的范圍

3 x2_min, x2_max = datas[:, 1].min(), datas[:, 1].max() #第1列的范圍

4 x1, x2 = np.mgrid[x1_min:x1_max:150j, x2_min:x2_max:150j] #生成網(wǎng)格采樣點(diǎn),橫軸為屬性x1,縱軸為屬性x2

5 grid_test = np.stack((x1.flat, x2.flat), axis=1) #測(cè)試點(diǎn)

6 #.flat 函數(shù)將兩個(gè)矩陣都變成兩個(gè)一維數(shù)組,調(diào)用stack函數(shù)組合成一個(gè)二維數(shù)組

7 print("grid_test = \n", grid_test)8

9 grid_hat = predict_fun(grid_test,W) #預(yù)測(cè)分類值

10 grid_hat = grid_hat.reshape(x1.shape) #使之與輸入的形狀相同

11 #grid_hat本來(lái)是一唯的,調(diào)用reshape()函數(shù)修改形狀,將其grid_hat轉(zhuǎn)換為兩個(gè)特征(長(zhǎng)度和寬度)

12 print("grid_hat = \n", grid_hat)13 print("grid_hat.shape: = \n", grid_hat.shape) #(150, 150)

(2)指定默認(rèn)字體

1 #2.指定默認(rèn)字體

2 mpl.rcParams['font.sans-serif'] = [u'SimHei']3 mpl.rcParams['axes.unicode_minus'] = False

(3)繪制圖像

1 #3.繪制圖像

2 cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])3 cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])4

5 alpha = 0.5

6

7 plt.pcolormesh(x1, x2, grid_hat, cmap=plt.cm.Paired) #預(yù)測(cè)值的顯示

8 #調(diào)用pcolormesh()函數(shù)將x1、x2兩個(gè)網(wǎng)格矩陣和對(duì)應(yīng)的預(yù)測(cè)結(jié)果grid_hat繪制在圖片上

9 #可以發(fā)現(xiàn)輸出為三個(gè)顏色區(qū)塊,分布表示分類的三類區(qū)域。cmap=plt.cm.Paired/cmap=cm_light表示繪圖樣式選擇Paired主題

10 #plt.scatter(datas[:, 0], datas[:, 1], c=labels, edgecolors='k', s=50, cmap=cm_dark) # 樣本

11 plt.plot(datas[:, 0], datas[:, 1], 'o', alpha=alpha, color='blue', markeredgecolor='k')12 ##繪制散點(diǎn)圖

13 plt.scatter(datas[:, 0], datas[:, 1], s=120, facecolors='none', zorder=10) #圈中測(cè)試集樣本

14 plt.xlabel(u'花萼長(zhǎng)度', fontsize=13) #X軸標(biāo)簽

15 plt.ylabel(u'花萼寬度', fontsize=13) #Y軸標(biāo)簽

16 plt.xlim(x1_min, x1_max) #x 軸范圍

17 plt.ylim(x2_min, x2_max) #y 軸范圍

18 plt.title(u'鳶尾花LogisticRegression二特征分類', fontsize=15)19 #plt.legend(loc=2) # 左上角繪制圖標(biāo)

20 #plt.grid()

21 plt.show()

五、實(shí)驗(yàn)結(jié)果

(1)運(yùn)行程序輸出的參數(shù):

使用二個(gè)特征:

輸出W為: [[-0.41462351 1.26263398 0.26536423]

[-1.07260354 -2.44478672 1.96448439]]

輸出predict為: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 0 0 0 2 0 2 0 2 0 2 2 2 2 2 2 0 2 2 2 2 2 2 2 2 0 0 0 0 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2 0 2 2 0 2 0 0 0 0 2 0 0 0 0 0 0 2 2 0 0 0 0 2 0 2 0 0 0 0 2 2 0 0 0 0 0 0 2 0 0 0 2 0 0 0 2 0 0 0 2 0 0 2]

誤判的樣本的個(gè)數(shù)為:28

使用四個(gè)特征:

輸出W為:

[[-0.09363942 -1.41359443 1.17376524 -2.3116611 -2.20018596]

[ 1.44071982 -0.05960463 -0.31391519 -0.87589944 -1.83255315]]

輸出predict為: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

誤判的樣本的個(gè)數(shù)為:8

(2)數(shù)據(jù)可視化結(jié)果如下:

六、結(jié)果分析與比較

由以上實(shí)驗(yàn)結(jié)果可以看出,使用了二特征的誤判的樣本個(gè)數(shù)為28(樣本總數(shù)為150),而使用了四個(gè)特征的訓(xùn)練結(jié)果,誤判的樣本個(gè)數(shù)為8,在一定程度上可以解釋使用的特征數(shù)過(guò)少的話,會(huì)導(dǎo)致欠擬合的情況發(fā)生。

為了后期的可視化畫(huà)圖更加直觀,故只取前兩列特征值向量進(jìn)行訓(xùn)練。結(jié)果展示如上圖所示。

完整實(shí)現(xiàn)代碼詳見(jiàn):【GitHub 】

【Reference】

總結(jié)

以上是生活随笔為你收集整理的python鸢尾花数据集_Python实现鸢尾花数据集分类问题——使用LogisticRegression分类器...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。