使用鳶尾花數據集實現一元邏輯回歸、多分類問題

目錄

    • 鳶尾花數據集
    • 邏輯回歸原理
      • 【1】從線性回歸到廣義線性回歸
      • 【2】邏輯回歸
      • 【3】損失函數
      • 【4】總結
    • TensorFlow實現一元邏輯回歸
    • 多分類問題原理
      • 獨熱編碼
      • 多分類的模型參數
      • 損失函數CCE
    • TensorFlow實現多分類問題
      • 獨熱編碼
      • 計算準確率
      • 計算交叉熵損失函數
      • 使用花瓣長度、花瓣寬度將三種鳶尾花區分開
    • 總結

鳶尾花數據集

150個樣本
4個屬性:
花萼長度(Sepal Length)
花萼寬度(Sepal Width)
花瓣長度(Petal Length)
花瓣寬度(Petal Width)
1個標簽:山鳶尾(Setosa)、變色鳶尾(Versicolour)、維吉尼亞鳶尾(Virginica)

邏輯回歸原理

【1】從線性回歸到廣義線性回歸

在這里插入圖片描述
在這里插入圖片描述

廣義線性回歸通過聯系函數,對線性模型的結果進行一次非線性變換,使他能夠描述更加復雜的關系。

【2】邏輯回歸

在這里插入圖片描述
在這里插入圖片描述

階躍函數不是一個單調可微的函數、可以使用對數幾率函數替代

在這里插入圖片描述

sigmoid函數將(-無窮,+無窮)的輸入轉化到(0,1)

在這里插入圖片描述

【3】損失函數

線性回歸的處理值是連續值,不適合處理分類任務
用sigmoid函數,將線性回歸的返回值映射到(0,1)之間的概率值,然后設定閾值,實現分類
sigmoid函數大部分比較平緩,導數值較小,這導致了參數迭代更新緩慢
在線性回歸中平方損失函數是一個凸函數,只有一個極小值點
但是在邏輯回歸中,它的平方損失函數是一個非凸函數,有許多局部極小值點,使用梯度下降法可能得到的知識局部極小值
所以,在邏輯回歸中一般使用交叉熵損失函數(聯系統計學中的極大似然估計)
注意式子

在這里插入圖片描述
標簽分別等于1,0時的損失函數曲線在這里插入圖片描述

損失函數的性質:1、非負性,保證不同性質的樣本誤差不會相互抵消2、一致性,函數的值應該與誤差的變化趨勢一致。
這兩點交叉熵損失函數都能保證,并且此函數還有很大的優勢無需對sigmoid函數求導
在這里插入圖片描述
可以有效解決平方損失函數參數更新過慢的問題,偏導數的值只受到預測值與真實值之間誤差的影響
并且它還是個凸函數,所以使用梯度下降法得到的最小值就是全局最小值

在這里插入圖片描述

【4】總結

在這里插入圖片描述

TensorFlow實現一元邏輯回歸

import tensorflow as tf 
import numpy as np 
import matplotlib.pyplot as plt x=np.array([137.97,104.50,100.00,126.32,79.20,99.00,124.00,114.00,106.69,140.05,53.75,46.91,68.00,63.02,81.26,86.21])
y=np.array([1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,0])
#plt.scatter(x,y)
#中心化操作,使得中心點為0
x_train=x-np.mean(x)
y_train=y
plt.scatter(x_train,y_train)
#設置超參數
learn_rate=0.005
#迭代次數
iter=5
#每10次迭代顯示一下效果
display_step=1
#設置模型參數初始值
np.random.seed(612)
w=tf.Variable(np.random.randn())
b=tf.Variable(np.random.randn())
#觀察初始參數模型
x_start=range(-80,80)
y_start=1/(1+tf.exp(-(w*x_start+b)))
plt.plot(x_start,y_start,color="red",linewidth=3)
#訓練模型
#存放訓練集的交叉熵損失、準確率
cross_train=[]  
acc_train=[]
for i in range(0,iter+1):with tf.GradientTape() as tape:#sigmoid函數pred_train=1/(1+tf.exp(-(w*x_train+b)))#交叉熵損失函數Loss_train=-tf.reduce_mean(y_train*tf.math.log(pred_train)+(1-y_train)*tf.math.log(1-pred_train))#訓練集準確率Accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.where(pred_train<0.5,0,1),y_train),tf.float32))#記錄每一次迭代的損失和準確率cross_train.append(Loss_train)acc_train.append(Accuracy_train)    #更新參數dL_dw,dL_db = tape.gradient(Loss_train,[w,b])w.assign_sub(learn_rate*dL_dw)b.assign_sub(learn_rate*dL_db)#plt.plot(x,pred)if i % display_step==0:print("i:%i, Train Loss:%f,Accuracy:%f"%(i,cross_train[i],acc_train[i]))y_start=1/(1+tf.exp(-(w*x_start+b)))plt.plot(x_start,y_start)#進行分類,并不是測試集,測試集是有標簽的數據,而我們這邊沒有標簽,這里是真實場景的應用情況
#商品房面積
x_test=[128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00,162.00,114.60]
#根據面積計算概率,這里使用訓練數據的平均值進行中心化處理
pred_test=1/(1+tf.exp(-(w*(x_test-np.mean(x))+b)))
#根據概率進行分類
y_test=tf.where(pred_test<0.5,0,1) 
#打印數據
for i in range(len(x_test)):print(x_test[i],"\t",pred_test[i].numpy(),"\t",y_test[i].numpy(),"\t")
#可視化輸出
plt.figure()
plt.scatter(x_test,y_test)
x_=np.array(range(-80,80))
y_=1/(1+tf.exp(-(w*x_+b)))
plt.plot(x_+np.mean(x),y_)
plt.show()
訓練誤差以及準確率
損失函數迭代
新樣本測試
模型

多元邏輯回歸則是用多個特征變量去解決二分類問題,這里就不做詳細展開。

多分類問題原理

獨熱編碼

在這里插入圖片描述

多分類的模型參數

二分類問題模型輸出的是一個連續的函數。
多分類問題模型輸出的是概率。
在這里插入圖片描述
二分類的模型參數是一個列向量W(n+1行)
多分類的模型參數是一個矩陣W(n+1行,n+1列)
這里使用softmax回歸(而不是對數幾率函數)。
softmax回歸:適用于樣本的標簽互斥的情況。比如,樣本的標簽為,房子,小車和自行車,這三類之間是沒有關系的。樣本只能是屬于其中一個標簽。
邏輯回歸:使用于樣本的標簽有重疊的情況。比如:外套,大衣和毛衣,一件衣服可以即屬于大衣,由屬于外套。這個時候就需要三個獨立的邏輯回歸模型。
關于理論的講解,可以轉到下面鏈接:
softmax回歸
吳恩達機器學習
在這里插入圖片描述

損失函數CCE

在這里插入圖片描述
舉個例子:
在這里插入圖片描述

TensorFlow實現多分類問題

邏輯回歸只能解決二分類問題,

獨熱編碼

a=[0,2,3,5]
#獨熱編碼
#one_hot(一維數組/張量,編碼深度)
b=tf.one_hot(a,6)
print(b)

效果:

tf.Tensor(
[[1. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0.][0. 0. 0. 1. 0. 0.][0. 0. 0. 0. 0. 1.]], shape=(4, 6), dtype=float32)

計算準確率

步驟:

導入預測值
導入標記
將標記獨熱編碼
獲取預測值中的最大數索引
判斷預測值是否與樣本標記是否相同
上個步驟判斷結果的將布爾值轉化為數字
計算準確率

#準確率#預測值
pred=np.array([[0.1,0.2,0.7],[0.1,0.7,0.2],[0.3,0.4,0.3]])
#標記
y=np.array([2,1,0])
#標記獨熱編碼
y_onehot=np.array([[0,0,1],[0,1,0],[1,0,0]])#預測值中的最大數索引
print(tf.argmax(pred,axis=1))
#判斷預測值是否與樣本標記是否相同
print(tf.equal(tf.argmax(pred,axis=1),y))
#將布爾值轉化為數字
print(tf.cast(tf.equal(tf.argmax(pred,axis=1),y),tf.float32))
#計算準確率
print(tf.reduce_mean(tf.cast(tf.equal(tf.argmax(pred,axis=1),y),tf.float32)))

結果:

tf.Tensor([2 1 1], shape=(3,), dtype=int64)
tf.Tensor([ True  True False], shape=(3,), dtype=bool)
tf.Tensor([1. 1. 0.], shape=(3,), dtype=float32)
tf.Tensor(0.6666667, shape=(), dtype=float32)

計算交叉熵損失函數

#交叉損失函數
#計算樣本交叉熵
print(-y_onehot*tf.math.log(pred))
#計算所有樣本交叉熵之和
print(-tf.reduce_sum(-y_onehot*tf.math.log(pred)))
#計算平均交叉熵損失
print(-tf.reduce_sum(-y_onehot*tf.math.log(pred))/len(pred))

效果:

tf.Tensor(
[[-0.         -0.          0.35667494][-0.          0.35667494 -0.        ][ 1.2039728  -0.         -0.        ]], shape=(3, 3), dtype=float64)
tf.Tensor(-1.917322692203401, shape=(), dtype=float64)
tf.Tensor(-0.6391075640678003, shape=(), dtype=float64)

使用花瓣長度、花瓣寬度將三種鳶尾花區分開

import tensorflow as tf 
import pandas as pd 
import numpy as np
import matplotlib as mpl 
import matplotlib.pyplot as plt #=============================加載數據============================================
#下載鳶尾花數據集iris
#訓練數據集 120條數據
#測試數據集 30條數據
import tensorflow as tf
TRAIN_URL = "http://download.tensorflow.org/data/iris_training.csv"
train_path = tf.keras.utils.get_file(TRAIN_URL.split('/')[-1],TRAIN_URL)df_iris_train = pd.read_csv(train_path,header=0)
#=============================處理數據============================================
iris_train = np.array(df_iris_train)
#觀察形狀
print(iris_train.shape)
#提取花瓣長度、花瓣寬度屬性
x_train=iris_train[:,2:4]
#提取花瓣標簽
y_train=iris_train[:,4]
print(x_train.shape,y_train)
num_train=len(x_train)
x0_train =np.ones(num_train).reshape(-1,1)
X_train =tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32)
Y_train =tf.one_hot(tf.constant(y_train,dtype=tf.int32),3)print(X_train.shape,Y_train)#=============================設置超參數、設置模型參數初始值============================================
learn_rate=0.2
#迭代次數
iter=500
#每10次迭代顯示一下效果
display_step=100
np.random.seed(612)
W=tf.Variable(np.random.randn(3,3),dtype=tf.float32)
#=============================訓練模型============================================
#存放訓練集準確率、交叉熵損失
acc=[]
cce=[]
for i in range(0,iter+1):with tf.GradientTape() as tape:PRED_train=tf.nn.softmax(tf.matmul(X_train,W))#計算CCELoss_train=-tf.reduce_sum(Y_train*tf.math.log(PRED_train))/num_train#計算啊準確度accuracy=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(PRED_train.numpy(),axis=1),y_train),tf.float32))acc.append(accuracy)cce.append(Loss_train)#更新參數dL_dW = tape.gradient(Loss_train,W)W.assign_sub(learn_rate*dL_dW)#plt.plot(x,pred)if i % display_step==0:print("i:%i, Acc:%f,CCE:%f"%(i,acc[i],cce[i]))#觀察訓練結果
print(PRED_train.shape)
#相加之后概率和應該為1
print(tf.reduce_sum(PRED_train,axis=1)) 
#轉換為自然順序編碼
print(tf.argmax(PRED_train.numpy(),axis=1))#繪制分類圖
#設置圖的大小
M=500
x1_min,x2_min =x_train.min(axis=0)
x1_max,x2_max =x_train.max(axis=0)
#在閉區間[min,max]生成M個間隔相同的數字
t1 =np.linspace(x1_min,x1_max,M)
t2 =np.linspace(x2_min,x2_max,M)
m1,m2 =np.meshgrid(t1,t2)m0=np.ones(M*M)
#堆疊數組S
X_ =tf.cast(np.stack((m0,m1.reshape(-1),m2.reshape(-1)),axis=1),tf.float32)
Y_ =tf.nn.softmax(tf.matmul(X_,W))
#轉換為自然順序編碼,決定網格顏色
Y_ =tf.argmax(Y_.numpy(),axis=1)
n=tf.reshape(Y_,m1.shape)
plt.figure(figsize=(8,6))
cm_bg =mpl.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])
plt.pcolormesh(m1,m2,n,cmap=cm_bg)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap="brg")
plt.show()

效果:
在這里插入圖片描述

總結

對多分類問題的數據的劃分與處理與之前有所不同。
多分類問題所用到的softmax的意義也許再多回顧。
交叉熵損失函數與極大似然估計的關聯也需要再看看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開源HTML5應用開發框架 - iio Engine

隨著HTML5的發展&#xff0c;越來越多的基于HTML5技術的網頁開發框架出現&#xff0c;在今天的這篇文章中&#xff0c;我們將介紹iio Engine&#xff0c;它是一款開源的創建HTML5應用的web框架。整個框架非常的輕量級&#xff0c;只有45kb大小&#xff0c;并且整合了debug系統&…

c語言double root,C語言修仙

root(1)(2/2)AD1AD4林潯合理推測&#xff0c;青城山劍宗&#xff0c;也就是祁云所在的劍修一脈&#xff0c;掌握著一些道修并不知道的傳承。譬如——怎樣找到赤霄龍雀劍&#xff0c;又或者&#xff0c;怎樣使用它。這樣一來&#xff0c;青城的守衛陣法沒有反應也能解釋了&#…

【轉】Black Box

Introduction BlackBox是FPGA設計中一個重要的技巧&#xff0c;不過覺得Xilinx的文檔沒有很好地將它講清楚。 BlackBox的主要想法就是把設計的某一個子模塊單獨綜合&#xff0c;綜合的結果作為一個黑盒子子模塊&#xff0c;上層設計不再對這個模塊進行優化&#xff0c;只能看到…

Java Compiler disable()方法與示例

編譯器類disable()方法 (Compiler Class disable() method) disable() method is available in java.lang package. disable()方法在java.lang包中可用。 disable() method is used to cause the compiler to stop operation. disable()方法用于使編譯器停止操作。 disable() m…

【神經網絡計算】——神經網絡實現鳶尾花分類

本blog為觀看MOOC視頻與網易云課堂所做的筆記 課堂鏈接&#xff1a; 人工智能實踐:TensorFlow筆記 吳恩達機器學習 疑問與思考 為什么按照batch喂入數據 之前看的視頻里面處理數據都是一次性將所有數據喂入&#xff0c;現在看的這個視頻對數據進行了分組投入。這是為何&#…

第三章 染色動力學理論單元測試

1,準二級動力學模型認為,染色速率與()的二次方成正比 纖維上未被占滿的位置(空位)數量 2,研究染色動力學的意義有() 了解染料走向平衡的速率。 初染速率。 勻染性。 3,求出染料的擴散系數的意義有() 了解各因素對擴散系數的影響。 求出不同溫度下的擴散系數,計算…

CDOJ--1668

原題鏈接&#xff1a;http://acm.uestc.edu.cn/problem.php?pid1668 由于題目意思指的是將分數拆分成不同的單位分數之和&#xff0c;所以就不用考慮將2/3拆成1/31/3這種情況了&#xff1b;又由于好的拆分要求項數即len要少&#xff0c;最小的項要大&#xff0c;故可以采用迭代…

c# xaml語言教程,c#學習之30分鐘學會XAML

1.狂妄的WPF相對傳統的Windows圖形編程&#xff0c;需要做很多復雜的工作&#xff0c;引用許多不同的API。例如&#xff1a;WinForm(帶控件表單)、GDI(2D圖形)、DirectXAPI(3D圖形)以及流媒體和流文檔等&#xff0c;都需要不同的API來構建應用程序。WPF就是看著上面的操作復雜和…

(Android實戰)AsyncTask和Handler兩種異步方式實現原理和優缺點比較

1 AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,并提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最后反饋執行的結果給UI主線程. 使用的優點: l 簡單,快捷 l 過程可控 使用的缺點…

Java Collections list()方法與示例

集合類list()方法 (Collections Class list() method) list() method is available in java.util package. list()方法在java.util包中可用。 list() method is used to return an array list that contains all the elements returned by the given Enumeration and the way o…

第八章 異常

第八章 異常 異常事件可能是錯誤&#xff08;如試圖除以零&#xff09;&#xff0c;也可能是通常不會發生的事情。 Python提供功能強大的替代解決方案——異常處理機制。 異常是什么&#xff1f; Python使用異常對象來表示異常狀態&#xff0c;并在遇到錯誤時引發異常。異常…

hdu 1564 Play a game

對于本題&#xff0c;若要當前的 player 贏&#xff0c;剩下所走的步數必須是奇數步。所以對于每步的 player 所放棄的選擇的步數為偶數步。因此&#xff0c;對于整個 game 來說&#xff0c;所放棄的步數 m 為偶數步&#xff0c;設所走的步數為 k &#xff0c;則 n*n-1mk&…

【電設控制與圖像訓練題】【激光打靶】【opencv測試代碼以及效果】

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 規則 激光槍自動射擊裝置(E題) 【本科組】 一、任務 設計一個能夠控制激光槍擊發、自動報靶及自動瞄準等功能的電子系統。該…

.NET 小結之內存模型

.NET 小結之內存模型 為什么要解.NET 的內存模型 在.NET下的內存管理、垃圾回收其實大部分不需要我們操心&#xff0c;因為大部分.NET已經幫我們做了&#xff0c;通常情況下也不需要考慮這些。但是如果想要了解一些.NET一些稍微“底層”的原理&#xff0c;如&#xff1a;“裝箱…

C ++ STL中的set :: upper_bound()函數

C STL set :: upper_bound()函數 (C STL set::upper_bound() function) set::upper_bound() function is a predefined function, it is used to get the upper bound of any element in a set. set :: upper_bound()函數是預定義的函數&#xff0c;用于獲取集合中任何元素的上…

c語言if不能判斷u8變量值,C語言變量名命規則.doc

C語言變量名命名規則一、程序風格&#xff1a;???????? 1、嚴格采用階梯層次組織程序代碼&#xff1a;???????? 各層次縮進的分格采用VC的缺省風格&#xff0c;即每層次縮進為4格&#xff0c;括號位于下一行。??? 要求相匹配的大括號在同一列&#xff0c;對…

【電設控制與圖像訓練題】【激光打靶】【openmv測試代碼以及效果】

9.4加入串口通訊,送出靶心坐標、激光坐標、激光所在環數、方位;加入防誤判操作 博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 目錄 規則坐標系代碼總結相關openmv使用文…

MVC3中的視圖文件

在MVC3中的視圖部分&#xff0c;Razor視圖引擎是與以往不同的地方之一&#xff0c;使用Razor的視圖文件再也不是以往的ASPX文件了&#xff0c;是cshtml文件&#xff0c;在新建視圖的時候也會發現增加多了幾類文件 由上到下分別是 MVC 3 Layout Page&#xff1a;與原來Web Form的…

第九章 魔法方法、特性和迭代器

第九章 魔法方法、特性和迭代器 構造函數 構造函數&#xff08;constructor&#xff09;&#xff0c;它其實就是初始化方法&#xff0c;只是命名為__init__。 構造函數不同于普通方法的地方在于&#xff0c;將在對象創建后自動調用它們。 在Python中&#xff0c;創建構造函數…

PHP 代碼 加密

PHP 代碼 加密 此加密方法支持任意PHP版 代碼如下: <?php function RandAbc($length""){//返回隨機字符串 $str"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return str_shuffle($str); } $filenameindex.php; $T_k1RandAbc();//隨…