欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python代碼實(shí)現(xiàn)邏輯回歸logistic原理

 更新時(shí)間:2019年08月07日 09:57:53   作者:a_achengsong  
這篇文章主要介紹了python代碼實(shí)現(xiàn)邏輯回歸logistic原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Logistic Regression Classifier邏輯回歸主要思想就是用最大似然概率方法構(gòu)建出方程,為最大化方程,利用牛頓梯度上升求解方程參數(shù)。

  • 優(yōu)點(diǎn):計(jì)算代價(jià)不高,易于理解和實(shí)現(xiàn)。
  • 缺點(diǎn):容易欠擬合,分類精度可能不高。
  • 使用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型數(shù)據(jù)。

介紹邏輯回歸之前,我們先看一問題,有個(gè)黑箱,里面有白球和黑球,如何判斷它們的比例。

我們從里面抓3個(gè)球,2個(gè)黑球,1個(gè)白球。這時(shí)候,有人就直接得出了黑球67%,白球占比33%。這個(gè)時(shí)候,其實(shí)這個(gè)人使用了最大似然概率的思想,通俗來講,當(dāng)黑球是67%的占比的時(shí)候,我們抓3個(gè)球,出現(xiàn)2黑1白的概率最大。我們直接用公式來說明。

假設(shè)黑球占比為P,白球?yàn)?-P。于是我們要求解MAX(PP(1-P)),顯而易見P=67%(求解方法:對(duì)方程求導(dǎo),使導(dǎo)數(shù)為0的P值即為最優(yōu)解)

我們看邏輯回歸,解決的是二分類問題,是不是和上面黑球白球問題很像,是的,邏輯回歸也是最大似然概率來求解。

假設(shè)我們有n個(gè)獨(dú)立的訓(xùn)練樣本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一個(gè)觀察到的樣本(xi, yi)出現(xiàn)的概率是:

這里寫圖片描述

上面為什么是這樣呢?當(dāng)y=1的時(shí)候,后面那一項(xiàng)是不是沒有了,那就只剩下x屬于1類的概率,當(dāng)y=0的時(shí)候,第一項(xiàng)是不是沒有了,那就只剩下后面那個(gè)x屬于0的概率(1減去x屬于1的概率)。所以不管y是0還是1,上面得到的數(shù),都是(x, y)出現(xiàn)的概率。那我們的整個(gè)樣本集,也就是n個(gè)獨(dú)立的樣本出現(xiàn)的似然函數(shù)為(因?yàn)槊總€(gè)樣本都是獨(dú)立的,所以n個(gè)樣本出現(xiàn)的概率就是他們各自出現(xiàn)的概率相乘):

這里寫圖片描述

這里我們稍微變換下L(θ):取自然對(duì)數(shù),然后化簡(jiǎn)(不要看到一堆公式就害怕哦,很簡(jiǎn)單的哦,只需要耐心一點(diǎn)點(diǎn),自己動(dòng)手推推就知道了。注:有xi的時(shí)候,表示它是第i個(gè)樣本,下面沒有做區(qū)分了,相信你的眼睛是雪亮的),得到:

這里寫圖片描述

其中第三步到第四步使用了下面替換。

這里寫圖片描述

這時(shí)候?yàn)榍笞畲笾?,?duì)L(θ)對(duì)θ求導(dǎo),得到:

這里寫圖片描述

然后我們令該導(dǎo)數(shù)為0,即可求出最優(yōu)解。但是這個(gè)方程是無法解析求解(這里就不證明了)。
最后問題變成了,求解參數(shù)使方程L最大化,求解參數(shù)的方法梯度上升法(原理這里不解釋了,看詳細(xì)的代碼的計(jì)算方式應(yīng)該更容易理解些)。

根據(jù)這個(gè)轉(zhuǎn)換公式

這里寫圖片描述

我們代入?yún)?shù)和特征,求P,也就是發(fā)生1的概率。

這里寫圖片描述

上面這個(gè)也就是常提及的sigmoid函數(shù),俗稱激活函數(shù),最后用于分類(若P(y=1|x;Θ\ThetaΘ )大于0.5,則判定為1)。

下面是詳細(xì)的邏輯回歸代碼,代碼比較簡(jiǎn)單,主要是要理解上面的算法思想。個(gè)人建議,可以結(jié)合代碼看一步一步怎么算的,然后對(duì)比上面推導(dǎo)公式,可以讓人更加容易理解,并加深印象。

from numpy import *
filename='...\\testSet.txt' #文件目錄
def loadDataSet():  #讀取數(shù)據(jù)(這里只有兩個(gè)特征)
  dataMat = []
  labelMat = []
  fr = open(filename)
  for line in fr.readlines():
    lineArr = line.strip().split()
    dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  #前面的1,表示方程的常量。比如兩個(gè)特征X1,X2,共需要三個(gè)參數(shù),W1+W2*X1+W3*X2
    labelMat.append(int(lineArr[2]))
  return dataMat,labelMat

def sigmoid(inX): #sigmoid函數(shù)
  return 1.0/(1+exp(-inX))

def gradAscent(dataMat, labelMat): #梯度上升求最優(yōu)參數(shù)
  dataMatrix=mat(dataMat) #將讀取的數(shù)據(jù)轉(zhuǎn)換為矩陣
  classLabels=mat(labelMat).transpose() #將讀取的數(shù)據(jù)轉(zhuǎn)換為矩陣
  m,n = shape(dataMatrix)
  alpha = 0.001 #設(shè)置梯度的閥值,該值越大梯度上升幅度越大
  maxCycles = 500 #設(shè)置迭代的次數(shù),一般看實(shí)際數(shù)據(jù)進(jìn)行設(shè)定,有些可能200次就夠了
  weights = ones((n,1)) #設(shè)置初始的參數(shù),并都賦默認(rèn)值為1。注意這里權(quán)重以矩陣形式表示三個(gè)參數(shù)。
  for k in range(maxCycles):
    h = sigmoid(dataMatrix*weights)
    error = (classLabels - h)   #求導(dǎo)后差值
    weights = weights + alpha * dataMatrix.transpose()* error #迭代更新權(quán)重
  return weights

def stocGradAscent0(dataMat, labelMat): #隨機(jī)梯度上升,當(dāng)數(shù)據(jù)量比較大時(shí),每次迭代都選擇全量數(shù)據(jù)進(jìn)行計(jì)算,計(jì)算量會(huì)非常大。所以采用每次迭代中一次只選擇其中的一行數(shù)據(jù)進(jìn)行更新權(quán)重。
  dataMatrix=mat(dataMat)
  classLabels=labelMat
  m,n=shape(dataMatrix)
  alpha=0.01
  maxCycles = 500
  weights=ones((n,1))
  for k in range(maxCycles):
    for i in range(m): #遍歷計(jì)算每一行
      h = sigmoid(sum(dataMatrix[i] * weights))
      error = classLabels[i] - h
      weights = weights + alpha * error * dataMatrix[i].transpose()
  return weights

def stocGradAscent1(dataMat, labelMat): #改進(jìn)版隨機(jī)梯度上升,在每次迭代中隨機(jī)選擇樣本來更新權(quán)重,并且隨迭代次數(shù)增加,權(quán)重變化越小。
  dataMatrix=mat(dataMat)
  classLabels=labelMat
  m,n=shape(dataMatrix)
  weights=ones((n,1))
  maxCycles=500
  for j in range(maxCycles): #迭代
    dataIndex=[i for i in range(m)]
    for i in range(m): #隨機(jī)遍歷每一行
      alpha=4/(1+j+i)+0.0001 #隨迭代次數(shù)增加,權(quán)重變化越小。
      randIndex=int(random.uniform(0,len(dataIndex))) #隨機(jī)抽樣
      h=sigmoid(sum(dataMatrix[randIndex]*weights))
      error=classLabels[randIndex]-h
      weights=weights+alpha*error*dataMatrix[randIndex].transpose()
      del(dataIndex[randIndex]) #去除已經(jīng)抽取的樣本
  return weights

def plotBestFit(weights): #畫出最終分類的圖
  import matplotlib.pyplot as plt
  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.0, 3.0, 0.1)
  y = (-weights[0]-weights[1]*x)/weights[2]
  ax.plot(x, y)
  plt.xlabel('X1')
  plt.ylabel('X2')
  plt.show()

def main():
  dataMat, labelMat = loadDataSet()
  weights=gradAscent(dataMat, labelMat).getA()
  plotBestFit(weights)

if __name__=='__main__':
  main()

跑完代碼結(jié)果:

這里寫圖片描述

當(dāng)然,還可以換隨機(jī)梯度上升和改進(jìn)的隨機(jī)梯度上升算法試試,效果都還不錯(cuò)。

下面是代碼使用的數(shù)據(jù),可以直接復(fù)制本地text里面,跑上面代碼。

-0.017612	14.053064	0
-1.395634	4.662541	1
-0.752157	6.538620	0
-1.322371	7.152853	0
0.423363	11.054677	0
0.406704	7.067335	1
0.667394	12.741452	0
-2.460150	6.866805	1
0.569411	9.548755	0
-0.026632	10.427743	0
0.850433	6.920334	1
1.347183	13.175500	0
1.176813	3.167020	1
-1.781871	9.097953	0
-0.566606	5.749003	1
0.931635	1.589505	1
-0.024205	6.151823	1
-0.036453	2.690988	1
-0.196949	0.444165	1
1.014459	5.754399	1
1.985298	3.230619	1
-1.693453	-0.557540	1
-0.576525	11.778922	0
-0.346811	-1.678730	1
-2.124484	2.672471	1
1.217916	9.597015	0
-0.733928	9.098687	0
-3.642001	-1.618087	1
0.315985	3.523953	1
1.416614	9.619232	0
-0.386323	3.989286	1
0.556921	8.294984	1
1.224863	11.587360	0
-1.347803	-2.406051	1
1.196604	4.951851	1
0.275221	9.543647	0
0.470575	9.332488	0
-1.889567	9.542662	0
-1.527893	12.150579	0
-1.185247	11.309318	0
-0.445678	3.297303	1
1.042222	6.105155	1
-0.618787	10.320986	0
1.152083	0.548467	1
0.828534	2.676045	1
-1.237728	10.549033	0
-0.683565	-2.166125	1
0.229456	5.921938	1
-0.959885	11.555336	0
0.492911	10.993324	0
0.184992	8.721488	0
-0.355715	10.325976	0
-0.397822	8.058397	0
0.824839	13.730343	0
1.507278	5.027866	1
0.099671	6.835839	1
-0.344008	10.717485	0
1.785928	7.718645	1
-0.918801	11.560217	0
-0.364009	4.747300	1
-0.841722	4.119083	1
0.490426	1.960539	1
-0.007194	9.075792	0
0.356107	12.447863	0
0.342578	12.281162	0
-0.810823	-1.466018	1
2.530777	6.476801	1
1.296683	11.607559	0
0.475487	12.040035	0
-0.783277	11.009725	0
0.074798	11.023650	0
-1.337472	0.468339	1
-0.102781	13.763651	0
-0.147324	2.874846	1
0.518389	9.887035	0
1.015399	7.571882	0
-1.658086	-0.027255	1
1.319944	2.171228	1
2.056216	5.019981	1
-0.851633	4.375691	1
-1.510047	6.061992	0
-1.076637	-3.181888	1
1.821096	10.283990	0
3.010150	8.401766	1
-1.099458	1.688274	1
-0.834872	-1.733869	1
-0.846637	3.849075	1
1.400102	12.628781	0
1.752842	5.468166	1
0.078557	0.059736	1
0.089392	-0.715300	1
1.825662	12.693808	0
0.197445	9.744638	0
0.126117	0.922311	1
-0.679797	1.220530	1
0.677983	2.556666	1
0.761349	10.693862	0
-2.168791	0.143632	1
1.388610	9.341997	0
0.317029	14.739025	0

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)

    初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)

    本篇文章是小白篇初學(xué)python的同學(xué)可以來共同學(xué)習(xí)了,本篇文章主要講解了python數(shù)學(xué)建模過程中的第一步數(shù)據(jù)導(dǎo)入,數(shù)據(jù)導(dǎo)入是所有數(shù)模編程的第一步,比你想象的更重要
    2021-08-08
  • python中的隨機(jī)數(shù)?Random介紹

    python中的隨機(jī)數(shù)?Random介紹

    這篇文章主要介紹了python中的隨機(jī)數(shù)?Random,Python標(biāo)準(zhǔn)庫(kù)中的random函數(shù),可以生成隨機(jī)浮點(diǎn)數(shù)、整數(shù)、字符串,甚至幫助你隨機(jī)選擇列表序列中的一個(gè)元素,打亂一組數(shù)據(jù)等,即用來生成隨機(jī)數(shù),下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • Python全局變量關(guān)鍵字global的簡(jiǎn)單使用

    Python全局變量關(guān)鍵字global的簡(jiǎn)單使用

    python中g(shù)lobal關(guān)鍵字主要作用是聲明變量的作用域,下面這篇文章主要給大家介紹了關(guān)于Python全局變量關(guān)鍵字global的簡(jiǎn)單使用,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • Python繪制圣誕樹+落葉+雪花+背景音樂+浪漫彈窗?五合一版圣誕樹

    Python繪制圣誕樹+落葉+雪花+背景音樂+浪漫彈窗?五合一版圣誕樹

    馬上不就到圣誕節(jié)了嘛,我看到朋友圈里很多小伙伴再紛紛炫耀自己收到的專屬圣誕樹,今天小編給大家介紹的是通過Python繪制的五合一版圣誕樹:圣誕樹+落葉+雪花+背景音樂+浪漫彈窗。感興趣的小伙伴快來學(xué)習(xí)一下吧
    2021-12-12
  • Python中字典的基本知識(shí)初步介紹

    Python中字典的基本知識(shí)初步介紹

    這篇文章主要介紹了Python中字典的基本知識(shí)初步介紹,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Python中*args和**kwargs的作用

    Python中*args和**kwargs的作用

    *args和**kwargs,以及單獨(dú)的*,**到底是啥作用呢?原理是啥呢?讀完這篇文章你就徹底明白了,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • python3?最常用的三種裝飾器語法匯總

    python3?最常用的三種裝飾器語法匯總

    這篇文章主要介紹了python3?最常用的三種裝飾器語法總結(jié),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 詳解Python 模擬實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式的實(shí)例

    詳解Python 模擬實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式的實(shí)例

    這篇文章主要介紹了詳解Python 模擬實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式的實(shí)例的相關(guān)資料,這里使用了線程知識(shí),隊(duì)列知識(shí)及循環(huán)的知識(shí),需要的朋友可以參考下
    2017-08-08
  • Python中將兩個(gè)或多個(gè)list合成一個(gè)list的方法小結(jié)

    Python中將兩個(gè)或多個(gè)list合成一個(gè)list的方法小結(jié)

    python中,list這種數(shù)據(jù)結(jié)構(gòu)很常用到,如果兩個(gè)或者多個(gè)list結(jié)構(gòu)相同,內(nèi)容類型相同,我們通常會(huì)將兩個(gè)或者多個(gè)list合并成一個(gè),這樣我們?cè)傺h(huán)遍歷的時(shí)候就可以一次性處理掉了
    2019-05-05
  • python3中sys.argv的實(shí)例用法

    python3中sys.argv的實(shí)例用法

    在本篇文章里小編給大家分享的是關(guān)于python3中sys.argv的實(shí)例用法內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-04-04

最新評(píng)論