最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

這里寫(xiě)圖片描述

上面為什么是這樣呢?當(dāng)y=1的時(shí)候,后面那一項(xiàng)是不是沒(méi)有了,那就只剩下x屬于1類(lèi)的概率,當(dāng)y=0的時(shí)候,第一項(xiàng)是不是沒(méi)有了,那就只剩下后面那個(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)的概率相乘):

這里寫(xiě)圖片描述

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

這里寫(xiě)圖片描述

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

這里寫(xiě)圖片描述

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

這里寫(xiě)圖片描述

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

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

這里寫(xiě)圖片描述

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

這里寫(xiě)圖片描述

上面這個(gè)也就是常提及的sigmoid函數(shù),俗稱激活函數(shù),最后用于分類(lèi)(若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ī)選擇樣本來(lái)更新權(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): #畫(huà)出最終分類(lèi)的圖
  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é)果:

這里寫(xiě)圖片描述

當(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)文章

  • Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例

    Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)的幾個(gè)常用排序算法實(shí)例例如直接插入排序、直接選擇排序、冒泡排序、快速排序等,需要的朋友可以參考下
    2014-06-06
  • python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法

    python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法

    今天小編就為大家分享一篇python pands實(shí)現(xiàn)execl轉(zhuǎn)csv 并修改csv指定列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • pycharm指定python路徑過(guò)程詳解

    pycharm指定python路徑過(guò)程詳解

    這篇文章主要介紹了Pycharm指定python路徑過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • python使用正則表達(dá)式匹配字符串開(kāi)頭并打印示例

    python使用正則表達(dá)式匹配字符串開(kāi)頭并打印示例

    這篇文章主要介紹了python使用正則表達(dá)式匹配字符串開(kāi)頭并打印的方法,結(jié)合實(shí)例形式分析了Python基于正則表達(dá)式操作字符串的相關(guān)技巧,需要的朋友可以參考下
    2017-01-01
  • Pytorch出現(xiàn)錯(cuò)誤Attribute?Error:module?‘torch‘?has?no?attribute?'_six'解決

    Pytorch出現(xiàn)錯(cuò)誤Attribute?Error:module?‘torch‘?has?no?attrib

    這篇文章主要給大家介紹了關(guān)于Pytorch出現(xiàn)錯(cuò)誤Attribute?Error:module?‘torch‘?has?no?attribute?'_six'解決的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Django獲取應(yīng)用下的所有models的例子

    Django獲取應(yīng)用下的所有models的例子

    今天小編就為大家分享一篇Django獲取應(yīng)用下的所有models的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • 跟老齊學(xué)Python之變量和參數(shù)

    跟老齊學(xué)Python之變量和參數(shù)

    對(duì)于變量和參數(shù),不管是已經(jīng)敲代碼多年的老鳥(niǎo),還是剛剛接觸編程的小白,都會(huì)有時(shí)候清楚,有時(shí)候又有點(diǎn)模糊。因?yàn)?,在?shí)際應(yīng)用中,它們之間分分離離,比如,敲代碼都知道,x=3中x是變量,它不是參數(shù),但是在函數(shù)y=3x+4中,x是變量,也是參數(shù)。
    2014-10-10
  • Python matplotlib繪制散點(diǎn)圖的實(shí)例代碼

    Python matplotlib繪制散點(diǎn)圖的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Python matplotlib繪制散點(diǎn)圖的相關(guān)資料,所謂散點(diǎn)圖就是反映兩組變量每個(gè)數(shù)據(jù)點(diǎn)的值,并且從散點(diǎn)圖可以看出它們之間的相關(guān)性,需要的朋友可以參考下
    2021-06-06
  • pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    在PS中,我們可以利用液化工具對(duì)人像進(jìn)行瘦臉、放大眼睛等系列的常規(guī)操作。今天我們來(lái)了解一下這些操作的算法原理,并用pytorch?膨脹算法來(lái)實(shí)現(xiàn)大眼效果,感興趣的可以了解一下
    2021-11-11
  • Python綜合應(yīng)用名片管理系統(tǒng)案例詳解

    Python綜合應(yīng)用名片管理系統(tǒng)案例詳解

    這篇文章主要介紹了Python綜合應(yīng)用名片管理系統(tǒng),結(jié)合具體案例形式詳細(xì)分析了Python名片管理系統(tǒng)相關(guān)步驟、原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01

最新評(píng)論

景宁| 金溪县| 那曲县| 台山市| 廊坊市| 济源市| 聂荣县| 靖边县| 灵丘县| 安福县| 盐边县| 鄂伦春自治旗| 泾阳县| 阜宁县| 开化县| 胶州市| 阳春市| 额敏县| 张北县| 开江县| 凯里市| 化隆| 北宁市| 金山区| 西和县| 盐源县| 南安市| 乌拉特中旗| 和硕县| 石渠县| 福安市| 陵川县| 精河县| 全南县| 徐水县| 邵东县| 珲春市| 泊头市| 绵阳市| 锦州市| 鄱阳县|