Python?Logistic邏輯回歸算法使用詳解
相關(guān)導(dǎo)入
from google.colab import drive drive.mount("/content/drive")
Mounted at /content/drive
Logistic回歸
優(yōu)點(diǎn):計(jì)算代價(jià)不高,易于理解和實(shí)現(xiàn)
缺點(diǎn):容易欠擬合,分類精度可能不高
適用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型數(shù)據(jù)
Sigmoid函數(shù)
訓(xùn)練算法-使用梯度上升找到最佳參數(shù)
def loadDataSet(): dataMat = [] labelMat = [] fr = open('/content/drive/MyDrive/Colab Notebooks/MachineLearning/《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》/Logistic回歸/Logistic回歸/testSet.txt') for line in fr.readlines(): lineArr = line.strip().split() dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) labelMat.append(int(lineArr[2])) return dataMat, labelMat
from math import * def sigmoid(inX): return 1.0/(1+exp(-inX))
from numpy import * def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) labelMat = mat(classLabels).transpose() m, n = shape(dataMatrix) alpha = 0.001 maxCycles = 500 weights = ones((n, 1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) error = (labelMat - h) weights = weights + alpha * dataMatrix.transpose() * error return weights
這是一個(gè)使用梯度上升算法進(jìn)行邏輯回歸的函數(shù)。主要步驟如下:
- 導(dǎo)入numpy庫(kù),用于矩陣運(yùn)算。
- 定義函數(shù)gradAscent,接受輸入?yún)?shù)dataMatIn和classLabels。
- 將dataMatIn和classLabels轉(zhuǎn)化為矩陣,并進(jìn)行轉(zhuǎn)置,得到dataMatrix和labelMat。
- 獲取dataMatrix的行數(shù)m和列數(shù)n。
- 設(shè)置學(xué)習(xí)率alpha為0.001,并設(shè)定最大迭代次數(shù)maxCycles為500。
- 初始化權(quán)重weights為全1的n行1列矩陣。
- 進(jìn)行maxCycles次迭代:
a. 計(jì)算當(dāng)前權(quán)重對(duì)應(yīng)的預(yù)測(cè)結(jié)果h,通過(guò)sigmoid函數(shù)將dataMatrix與weights相乘得到。
b. 計(jì)算誤差error,即真實(shí)標(biāo)簽labelMat與預(yù)測(cè)結(jié)果h的差。
c. 更新權(quán)重weights,通過(guò)乘以學(xué)習(xí)率alpha,再乘以dataMatrix的轉(zhuǎn)置,再乘以誤差error。
- 返回最終的權(quán)重weights。
總結(jié):該函數(shù)通過(guò)梯度上升算法求解邏輯回歸模型的權(quán)重參數(shù),其中使用了sigmoid函數(shù)作為激活函數(shù),并通過(guò)迭代優(yōu)化權(quán)重參數(shù),使得模型的預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽盡可能接近。最終返回的權(quán)重參數(shù)可以用于預(yù)測(cè)新的數(shù)據(jù)樣本的類別。
dataArr, labelMat = loadDataSet()
weights = gradAscent(dataArr, labelMat)
分析數(shù)據(jù)-畫出決策邊界
import matplotlib.pyplot as plt def plotBestFit(weights): dataMat, labelMat = loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = [] ycord1 = [] xcord2 = [] ycord2 = [] for i in range(n): if int(labelMat[i]) == 1: xcord1.append(dataArr[i,1]) ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]) ycord2.append(dataArr[i,2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') ax.scatter(xcord2, ycord2, s=30, c='green') x = arange(-3, 3, 0.1) y = (-weights[0]-weights[1]*x) / weights[2] ax.plot(x, y) plt.xlabel('X1') plt.ylabel('X2') plt.show()
plotBestFit(weights.getA())
訓(xùn)練算法-隨機(jī)梯度上升
def stocGradAscent0(dataMatrix, classLabels): m, n = shape(dataMatrix) alpha = 0.01 weights = ones(n) for i in range(m): h = sigmoid(sum(dataMatrix[i] * weights)) error = classLabels[i] - h weights = weights + alpha * error * dataMatrix[i] return weights
dataArr, labelMat = loadDataSet() weights = stocGradAscent0(array(dataArr), labelMat)
改進(jìn)算法-優(yōu)化梯度算法
def stocGradAscent1(dataMatrix, classLabels, numIter=150): m, n = shape(dataMatrix) weights = ones(n) for j in range(numIter): dataIndex = list(range(m)) for i in range(m): alpha = 4/(1+j+i)+0.01 randIndex = int(random.uniform(0, len(dataIndex))) h = sigmoid(sum(dataMatrix[randIndex] * weights)) error = classLabels[randIndex] - h weights = weights + alpha * error * dataMatrix[randIndex] del(dataIndex[randIndex]) return weights
這段代碼實(shí)現(xiàn)了邏輯回歸的隨機(jī)梯度上升算法。邏輯回歸是一種二分類的機(jī)器學(xué)習(xí)算法,用于預(yù)測(cè)二分類問(wèn)題的結(jié)果。該算法通過(guò)最大化似然函數(shù)來(lái)更新權(quán)重,從而使得模型的預(yù)測(cè)結(jié)果與實(shí)際結(jié)果最接近。
算法的輸入包括數(shù)據(jù)集的特征矩陣(dataMatrix)、數(shù)據(jù)集的標(biāo)簽(classLabels)和迭代次數(shù)(numIter),默認(rèn)為150次。其中,特征矩陣是一個(gè)m行n列的矩陣,m表示樣本的數(shù)量,n表示特征的數(shù)量;標(biāo)簽是一個(gè)長(zhǎng)度為m的向量,表示每個(gè)樣本的分類標(biāo)簽。
算法的輸出是更新后的權(quán)重(weights),這些權(quán)重用于預(yù)測(cè)新樣本的分類結(jié)果。
算法的主要步驟如下:
- 初始化權(quán)重為一個(gè)長(zhǎng)度為n的向量,每個(gè)元素的初始值為1。
- 對(duì)于給定的迭代次數(shù),重復(fù)以下步驟:
a. 初始化一個(gè)包含樣本索引的列表(dataIndex)。
b. 對(duì)于每個(gè)樣本,重復(fù)以下步驟:
i. 計(jì)算學(xué)習(xí)率(alpha),其中alpha的值隨著迭代次數(shù)和樣本的索引i和j的變化而變化。這里使用的是固定的學(xué)習(xí)率,并加上一個(gè)小的常數(shù)以避免除零錯(cuò)誤。
ii. 從dataIndex中隨機(jī)選擇一個(gè)樣本的索引(randIndex)。
iii. 計(jì)算樣本的預(yù)測(cè)概率(h)。這里使用的是sigmoid函數(shù)將線性組合轉(zhuǎn)換為[0, 1]之間的概率值。
iv. 計(jì)算誤差(error),即實(shí)際標(biāo)簽(classLabels)與預(yù)測(cè)概率(h)之間的差值。
v. 更新權(quán)重(weights)。根據(jù)梯度上升算法,使用學(xué)習(xí)率(alpha)乘以誤差(error)乘以樣本的特征值(dataMatrix[randIndex]),然后將得到的結(jié)果加到權(quán)重(weights)上。
vi. 從dataIndex中刪除已經(jīng)使用過(guò)的樣本索引(randIndex)。
- 返回更新后的權(quán)重。
該算法每次迭代都使用一個(gè)隨機(jī)的樣本來(lái)更新權(quán)重,因此被稱為隨機(jī)梯度上升算法。相比于批量梯度上升算法,隨機(jī)梯度上升算法的計(jì)算效率更高,但收斂速度較慢,并且對(duì)于噪聲數(shù)據(jù)更敏感。
dataArr, labelMat = loadDataSet() weights = stocGradAscent1(array(dataArr), labelMat, 500) plotBestFit(weights)
到此這篇關(guān)于Python Logistic算法使用詳解的文章就介紹到這了,更多相關(guān)Python Logistic算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python中的數(shù)據(jù)精度問(wèn)題
這篇文章主要為大家詳細(xì)介紹了Python中常常遇到的一些數(shù)據(jù)精度問(wèn)題以及它們的解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10對(duì)pytorch中不定長(zhǎng)序列補(bǔ)齊的操作
這篇文章主要介紹了對(duì)pytorch中不定長(zhǎng)序列補(bǔ)齊的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Python3之外部文件調(diào)用Django程序操作model等文件實(shí)現(xiàn)方式
這篇文章主要介紹了Python3之外部文件調(diào)用Django程序操作model等文件實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python實(shí)現(xiàn)從Markdown到PDF的轉(zhuǎn)換的方法
Markdown,以其簡(jiǎn)潔的語(yǔ)法和易于閱讀的特性,成為了許多作家、開發(fā)者和學(xué)生記錄思想、編寫教程或撰寫報(bào)告的首選格式,然而,在分享或打印這些文檔時(shí),Markdown的純文本形式可能無(wú)法滿足對(duì)版式和布局的專業(yè)需求,本文將介紹如何用Python代碼輕松實(shí)現(xiàn)從Markdown到PDF的轉(zhuǎn)換2024-07-07Python-pip配置國(guó)內(nèi)鏡像源快速下載包的方法詳解
pip如果不配置國(guó)內(nèi)鏡像源的話,下載包的速度非常慢,畢竟默認(rèn)的源在國(guó)外呢,這篇文章主要介紹了Python-pip配置國(guó)內(nèi)鏡像源快速下載包的方法詳解,需要的朋友可以參考下2024-01-01Pytorch中的masked_fill基本知識(shí)操作
本文主要介紹了PyTorch中的masked_fill函數(shù)的基本知識(shí)和使用方法,masked_fill函數(shù)接受一個(gè)輸入張量和一個(gè)布爾掩碼作為主要參數(shù),掩碼的形狀必須與輸入張量相同,掩碼操作根據(jù)掩碼中的布爾值在輸出張量中填充指定的值或保留輸入張量中的值2024-10-10python全棧要學(xué)什么 python全棧學(xué)習(xí)路線
在本文中小編給大家整理了關(guān)于python全棧要學(xué)什么以及python全棧學(xué)習(xí)路線的知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2019-06-06