網站首頁 編程語言 正文
前言
Logistic回歸涉及到高等數學,線性代數,概率論,優化問題。本文盡量以最簡單易懂的敘述方式,以少講公式原理,多講形象化案例為原則,給讀者講懂Logistic回歸。如對數學公式過敏,引發不適,后果自負。
Logistic回歸原理與推導
Logistic回歸中雖然有回歸的字樣,但該算法是一個分類算法,如圖所示,有兩類數據(紅點和綠點)分布如下,如果需要對兩類數據進行分類,我們可以通過一條直線進行劃分(w0 * x0 + w1 * x1+w2 * x2)。當新的樣本(x1,x2)需要預測時,帶入直線函數中,函數值大于0,則為綠色樣本(正樣本),否則為紅樣本(負樣本)。
推廣到高維空間中,我們需要得到一個超平面(在二維是直線,在三維是平面,在n維是n-1的超平面)切分我們的樣本數據,實際上也就是求該超平面的W參數,這很類似于回歸,所以取名為Logistic回歸。
sigmoid函數
當然,我們不直接使用z函數,我們需要把z值轉換到區間[0-1]之間,轉換的z值就是判斷新樣本屬于正樣本的概率大小。 我們使用sigmoid函數完成這個轉換過程,公式如下。通過觀察sigmoid函數圖,如圖所示,當z值大于0時,σ值大于0.5,當z值小于0時,σ值小于于0.5。利用sigmoid函數,使得Logistic回歸本質上是一個基于條件概率的判別模型。
目標函數
其實,我們現在就是求W,如何求W呢,我們先看下圖,我們都能看出第二個圖的直線切分的最好,換句話說,能讓這些樣本點離直線越遠越好,這樣對于新樣本的到來,也具有很好的劃分,那如何用公式表示并計算這個目標函數呢?
這時就需要這個目標函數的值最大,以此求出θ。
梯度上升法
在介紹梯度上升法之前,我們看一個中學知識:求下面函數在x等于多少時,取最大值。
解:求f(x)的導數:2x,令其為0,求得x=0時,取最大值為0。但在函數復雜時,求出導數也很難計算函數的極值,這時就需要使用梯度上升法,通過迭代,一步步逼近極值,公式如下,我們順著導數的方向(梯度)一步步逼近。
利用梯度算法計算該函數的x值:
def f(x_old):
return -2*x_old
def cal():
x_old = 0
x_new = -6
eps = 0.01
presision = 0.00001
while abs(x_new-x_old)>presision:
x_old=x_new
x_new=x_old+eps*f(x_old)
return x_new
-0.0004892181072978443
Logistic回歸實踐
數據情況
讀入數據,并繪圖顯示:
def loadDataSet():
dataMat = [];labelMat = []
fr = open('數據/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
訓練算法
利用梯度迭代公式,計算W:
def sigmoid(inX):
return 1.0/(1 + np.exp(-inX))
def gradAscent(dataMatIn, labelMatIn):
dataMatrix = np.mat(dataMatIn)
labelMat = np.mat(labelMatIn).transpose()
m,n = np.shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = np.ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = labelMat - h
weights = weights + alpha * dataMatrix.transpose() * error
return weights
通過計算的weights繪圖,查看分類結果
算法優缺點
- 優點:易于理解和計算
- 缺點:精度不高
原文鏈接:https://juejin.cn/post/7081155423838928903
相關推薦
- 2022-10-06 Android開發Jetpack組件Room使用講解_Android
- 2022-06-13 docker從安裝入門到應用部署及私有倉庫搭建基礎命令_docker
- 2022-12-14 C++?Boost?ScopeExit超詳細講解_C 語言
- 2023-06-16 C語言中的結構體內嵌函數用法_C 語言
- 2023-03-16 python使用redis實現消息隊列(異步)的實現完整例程_python
- 2022-06-19 Visual?Studio創建WPF項目_實用技巧
- 2022-10-31 Kotlin函數式編程超詳細介紹_Android
- 2023-05-30 關于keras中卷積層Conv2D的學習記錄_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支