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

python機器學習理論與實戰(zhàn)(四)邏輯回歸

 更新時間:2022年07月30日 10:16:26   作者:marvin521  
這篇文章主要為大家詳細介紹了python機器學習理論與實戰(zhàn)第四篇,邏輯回歸的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

從這節(jié)算是開始進入“正規(guī)”的機器學習了吧,之所以“正規(guī)”因為它開始要建立價值函數(shù)(cost function),接著優(yōu)化價值函數(shù)求出權(quán)重,然后測試驗證。這整套的流程是機器學習必經(jīng)環(huán)節(jié)。今天要學習的話題是邏輯回歸,邏輯回歸也是一種有監(jiān)督學習方法(supervised machine learning)。邏輯回歸一般用來做預測,也可以用來做分類,預測是某個類別^.^!線性回歸想比大家都不陌生了,y=kx+b,給定一堆數(shù)據(jù)點,擬合出k和b的值就行了,下次給定X時,就可以計算出y,這就是回歸。而邏輯回歸跟這個有點區(qū)別,它是一種非線性函數(shù),擬合功能頗為強大,而且它是連續(xù)函數(shù),可以對其求導,這點很重要,如果一個函數(shù)不可求導,那它在機器學習用起來很麻煩,早期的海維賽德(Heaviside)階梯函數(shù)就因此被sigmoid函數(shù)取代,因為可導意味著我們可以很快找到其極值點,這就是優(yōu)化方法的重要思想之一:利用求導,得到梯度,然后用梯度下降法更新參數(shù)。

下面來看看邏輯回歸的sigmoid函數(shù),如(圖一)所示:

(圖一)

 (圖一)中上圖是sigmoid函數(shù)在定義域[-5,5] 上的形狀,而下圖是在定義域[-60,60]上的形狀,由這兩個圖可以看出,它比較適合做二類的回歸,因為嚴重兩級分化。Sigmoid函數(shù)的如(公式一)所示:

(公式一)

現(xiàn)在有了二類回歸函數(shù)模型,就可以把特征映射到這個模型上了,而且sigmoid函數(shù)的自變量只有一個Z,假設我們的特征為X=[x0,x1,x2…xn]。令,當給定大批的訓練樣本特征X時,我們只要找到合適的W=[w0,w1,w2…wn]來正確的把每個樣本特征X映射到sigmoid函數(shù)的兩級上,也就是說正確的完成了類別回歸就行了,那么以后來個測試樣本,只要和權(quán)重相乘后,帶入sigmoid函數(shù)計算出的值就是預測值啦,很簡單是吧。那怎么求權(quán)重W呢?

要計算W,就要進入優(yōu)化求解階段咯,用的方法是梯度下降法或者隨機梯度下降法。說到梯度下降,梯度下降一般對什么求梯度呢?梯度是一個函數(shù)上升最快的方向,沿著梯度方向我們可以很快找到極值點。我們找什么極值?仔細想想,當然是找訓練模型的誤差極值,當模型預測值和訓練樣本給出的正確值之間的誤差和最小時,模型參數(shù)就是我們要求的。當然誤差最小有可能導致過擬合,這個以后再說。我們先建立模型訓練誤差價值函數(shù)(cost function),如(公式二)所示:

(公式二)

(公式二)中Y表示訓練樣本真實值,當J(theta)最小時的所得的theta就是我們要求的模型權(quán)重,可以看出J(theta)是個凸函數(shù),得到的最小值也是全局最小。對其求導后得出梯度,如(公式三)所示:

(公式三)

由于我們是找極小值,而梯度方向是極大值方向,因此我們?nèi)∝撎枺刂撎荻确较蚋聟?shù),如(公式四)所示:

(公式四)

按照(公式四)的參數(shù)更新方法,當權(quán)重不再變化時,我們就宣稱找到了極值點,此時的權(quán)重也是我們要求的,整個參數(shù)更新示意圖如(圖二)所示:

(圖二)

原理到此為止邏輯回歸基本就說完了,下面進入代碼實戰(zhàn)階段:

from numpy import * 
 
def loadDataSet(): 
  dataMat = []; labelMat = [] 
  fr = open('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 
 
def sigmoid(inX): 
  return 1.0/(1+exp(-inX)) 

上面兩個函數(shù)分別是加載訓練集和定義sigmoid函數(shù),都比較簡單。下面發(fā)出梯度下降的代碼:

def gradAscent(dataMatIn, classLabels): 
  dataMatrix = mat(dataMatIn)       #convert to NumPy matrix 
  labelMat = mat(classLabels).transpose() #convert to NumPy matrix 
  m,n = shape(dataMatrix) 
  alpha = 0.001 
  maxCycles = 500 
  weights = ones((n,1)) 
  for k in range(maxCycles):       #heavy on matrix operations 
    h = sigmoid(dataMatrix*weights)   #matrix mult 
    error = (labelMat - h)       #vector subtraction 
    weights = weights + alpha * dataMatrix.transpose()* error #matrix mult 
  return weights 

梯度下降輸入訓練集和對應標簽,接著就是迭代跟新參數(shù),計算梯度,然后更新參數(shù),注意倒數(shù)第二句就是按照(公式三)和(公式四)來更新參數(shù)。

為了直觀的看到我們得到的權(quán)重是否正確的,我們把權(quán)重和樣本打印出來,下面是相關打印代碼:

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() 

打印的效果圖如(圖三)所示:

(圖三)

可以看出效果蠻不錯的,小錯誤是難免的,如果訓練集沒有錯誤反而危險,說到這基本就說完了,但是考慮到這個方法對少量樣本(幾百的)還行,在實際中當遇到10億數(shù)量級時,而且特征維數(shù)上千時,這種方法很恐怖,光計算梯度就要消耗大量時間,因此要使用隨機梯度下降方法。隨機梯度下降算法和梯度下降算法原理一樣,只是計算梯度不再使用所有樣本,而是使用一個或者一小批來計算梯度,這樣可以減少計算代價,雖然權(quán)重更新的路徑很曲折,但最終也會收斂的,如(圖四)所示

(圖四)

下面也發(fā)出隨機梯度下降的代碼:

def stocGradAscent1(dataMatrix, classLabels, numIter=150): 
  m,n = shape(dataMatrix) 
  weights = ones(n)  #initialize to all ones 
  for j in range(numIter): 
    dataIndex = range(m) 
    for i in range(m): 
      alpha = 4/(1.0+j+i)+0.0001  #apha decreases with iteration, does not  
      randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant 
      h = sigmoid(sum(dataMatrix[randIndex]*weights)) 
      error = classLabels[randIndex] - h 
      weights = weights + alpha * error * dataMatrix[randIndex] 
      del(dataIndex[randIndex]) 
  return weights 

最后也給出一個分類的代碼,只要把閾值設為0.5,大于0.5劃為一類,小于0.5劃為另一類就行了,代碼如下:

def classifyVector(inX, weights): 
  prob = sigmoid(sum(inX*weights)) 
  if prob > 0.5: return 1.0 
  else: return 0.0 

總結(jié):

優(yōu)點:計算量不高,容易實現(xiàn),對現(xiàn)實數(shù)據(jù)也很容易描述

缺點:很容易欠擬合,精度可能也會不高

參考文獻:

[1] machine learning in action. Peter Harrington

 [2] machine learning.Andrew Ng

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

相關文章

  • Python 多核并行計算的示例代碼

    Python 多核并行計算的示例代碼

    本篇文章主要介紹了Python 多核并行計算的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • pygame時序模塊time的具體使用

    pygame時序模塊time的具體使用

    Pygame Time模塊能夠幫助你更好地控制幀率和時間,從而增強游戲的可玩性,本文主要介紹了pygame時序模塊time的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Python中運行并行任務技巧

    Python中運行并行任務技巧

    這篇文章主要介紹了Python中運行并行任務技巧,本文給出了兩個示例,并用map來處理并行任務,需要的朋友可以參考下
    2015-02-02
  • 詳解python tkinter 圖片插入問題

    詳解python tkinter 圖片插入問題

    這篇文章主要介紹了詳解python tkinter 圖片插入問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • python在一個范圍內(nèi)取隨機數(shù)的簡單實例

    python在一個范圍內(nèi)取隨機數(shù)的簡單實例

    在本篇內(nèi)容里小編給大家分享了關于python在一個范圍內(nèi)取隨機數(shù)的簡單實例內(nèi)容,有需要的朋友們可以學習下。
    2020-08-08
  • Python?RawString與open文件的newline換行符遇坑解決

    Python?RawString與open文件的newline換行符遇坑解決

    這篇文章主要為大家介紹了Python?RawString與open文件的newline換行符遇坑解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Python實現(xiàn)批量識別銀行卡號碼以及自動寫入Excel表格步驟詳解

    Python實現(xiàn)批量識別銀行卡號碼以及自動寫入Excel表格步驟詳解

    這篇文章主要介紹了使用Python實現(xiàn)高效摸魚,批量識別銀行卡號碼并且自動寫入Excel表格,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • python Tkinter的簡單入門教程

    python Tkinter的簡單入門教程

    這篇文章主要介紹了python Tkinter的簡單入門教程,幫助大家更好的理解和學習使用python制作gui程序,感興趣的朋友可以了解下
    2021-04-04
  • Python將Office文檔(Word、Excel、PDF、PPT)轉(zhuǎn)為OFD格式的實現(xiàn)方法

    Python將Office文檔(Word、Excel、PDF、PPT)轉(zhuǎn)為OFD格式的實現(xiàn)方法

    OFD(Open Fixed-layout Document )是我國自主制定的一種開放版式文件格式標準,如果想要通過Python將Office文檔(如Word、Excel或PowerPoint)及PDF文檔轉(zhuǎn)換為OFD格式,可以參考本文中提供的實現(xiàn)方法,需要的朋友可以參考下
    2024-06-06
  • 對Python的zip函數(shù)妙用,旋轉(zhuǎn)矩陣詳解

    對Python的zip函數(shù)妙用,旋轉(zhuǎn)矩陣詳解

    今天小編就為大家分享一篇對Python的zip函數(shù)妙用,旋轉(zhuǎn)矩陣詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

白银市| 望江县| 民丰县| 千阳县| 东港市| 彭州市| 丰台区| 包头市| 德惠市| 固镇县| 博爱县| 永顺县| 舟山市| 广宁县| 临湘市| 钟山县| 玉树县| 喜德县| 普格县| 翁源县| 正阳县| 亚东县| 牙克石市| 苍山县| 甘孜| 正宁县| 嵩明县| 大邑县| 天台县| 南投市| 淳化县| 东兰县| 庆安县| 西和县| 贞丰县| 山东省| 项城市| 宁阳县| 鸡东县| 腾冲县| 当涂县|