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

python代碼實現邏輯回歸logistic原理

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

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

  • 優(yōu)點:計算代價不高,易于理解和實現。
  • 缺點:容易欠擬合,分類精度可能不高。
  • 使用數據類型:數值型和標稱型數據。

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

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

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

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

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

這里寫圖片描述

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

這里寫圖片描述

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

這里寫圖片描述

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

這里寫圖片描述

這時候為求最大值,對L(θ)對θ求導,得到:

這里寫圖片描述

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

根據這個轉換公式

這里寫圖片描述

我們代入參數和特征,求P,也就是發(fā)生1的概率。

這里寫圖片描述

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

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

from numpy import *
filename='...\\testSet.txt' #文件目錄
def loadDataSet():  #讀取數據(這里只有兩個特征)
  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,表示方程的常量。比如兩個特征X1,X2,共需要三個參數,W1+W2*X1+W3*X2
    labelMat.append(int(lineArr[2]))
  return dataMat,labelMat

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

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

def stocGradAscent0(dataMat, labelMat): #隨機梯度上升,當數據量比較大時,每次迭代都選擇全量數據進行計算,計算量會非常大。所以采用每次迭代中一次只選擇其中的一行數據進行更新權重。
  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): #遍歷計算每一行
      h = sigmoid(sum(dataMatrix[i] * weights))
      error = classLabels[i] - h
      weights = weights + alpha * error * dataMatrix[i].transpose()
  return weights

def stocGradAscent1(dataMat, labelMat): #改進版隨機梯度上升,在每次迭代中隨機選擇樣本來更新權重,并且隨迭代次數增加,權重變化越小。
  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): #隨機遍歷每一行
      alpha=4/(1+j+i)+0.0001 #隨迭代次數增加,權重變化越小。
      randIndex=int(random.uniform(0,len(dataIndex))) #隨機抽樣
      h=sigmoid(sum(dataMatrix[randIndex]*weights))
      error=classLabels[randIndex]-h
      weights=weights+alpha*error*dataMatrix[randIndex].transpose()
      del(dataIndex[randIndex]) #去除已經抽取的樣本
  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()

跑完代碼結果:

這里寫圖片描述

當然,還可以換隨機梯度上升和改進的隨機梯度上升算法試試,效果都還不錯。

下面是代碼使用的數據,可以直接復制本地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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python實現的幾個常用排序算法實例

    Python實現的幾個常用排序算法實例

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

    python pands實現execl轉csv 并修改csv指定列的方法

    今天小編就為大家分享一篇python pands實現execl轉csv 并修改csv指定列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • pycharm指定python路徑過程詳解

    pycharm指定python路徑過程詳解

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

    python使用正則表達式匹配字符串開頭并打印示例

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

    Pytorch出現錯誤Attribute?Error:module?‘torch‘?has?no?attrib

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

    Django獲取應用下的所有models的例子

    今天小編就為大家分享一篇Django獲取應用下的所有models的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 跟老齊學Python之變量和參數

    跟老齊學Python之變量和參數

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

    Python matplotlib繪制散點圖的實例代碼

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

    pytorch?膨脹算法實現大眼效果

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

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

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

最新評論

拉孜县| 定日县| 无棣县| 黄骅市| 东乌珠穆沁旗| 宽甸| 水富县| 龙南县| 望谟县| 淄博市| 陆良县| 南宫市| 根河市| 龙游县| 霍山县| 修水县| 红河县| 浦东新区| 长宁县| 青铜峡市| 林甸县| 额济纳旗| 河津市| 丰原市| 福泉市| 怀集县| 翁源县| 萝北县| 山西省| 凤台县| 云龙县| 密云县| 江津市| 台州市| 昆明市| 晋江市| 酒泉市| 沾益县| 依安县| 新丰县| 屏边|