Logistic回歸 python實現

Logistic回歸

算法優缺點:


1.計算代價不高,易于理解和實現
2.容易欠擬合,分類精度可能不高
3.適用數據類型:數值型和標稱型

算法思想:

  • 其實就我的理解來說,logistic回歸實際上就是加了個sigmoid函數的線性回歸,這個sigmoid函數的好處就在于,將結果歸到了0到1這個區間里面了,并且sigmoid(0)=0.5,也就是說里面的線性部分的結果大于零小于零就可以直接計算到了。這里的求解方式是梯度上升法,具體我就不扯了,最推薦的資料還是Ng的視頻,那里面的梯度下降就是啦,只不過一個是梯度上升的方向一個是下降的方向,做法什么的都一樣。
  • 而梯度上升(準確的說叫做“批梯度上升”)的一個缺點就是計算量太大了,每一次迭代都需要把所有的數據算一遍,這樣一旦訓練集大了之后,那么計算量將非常大,所以這里后面還提出了隨機梯度下降,思想就是每次只是根據一個data進行修正。這樣得到的最終的結果可能會有所偏差但是速度卻提高了很多,而且優化之后的偏差還是很小的。隨機梯度上升的另一個好處是這是一個在線算法,可以根據新數據的到來不斷處理

函數:

loadDataSet()
創建數據集,這里的數據集就是在一個文件中,這里面有三行,分別是兩個特征和一個標簽,但是我們在讀出的時候還加了X0這個屬性
sigmoid(inX)
sigmoid函數的計算,這個函數長這樣的,基本坐標大點就和階躍函數很像了


gradAscend(dataMatIn, classLabels)
梯度上升算法的實現,里面用到了numpy的數組,并且設定了迭代次數500次,然后為了計算速度都采取了矩陣計算,計算的過程中的公式大概是:w= w+alpha*(y-h)x[i](一直懶得寫公式,見諒。。。)
gradAscendWithDraw(dataMatIn, classLabels)
上面的函數加強版,增加了一個weight跟著迭代次數的變化曲線
stocGradAscent0(dataMatrix, classLabels)
這里為了加快速度用來隨機梯度上升,即每次根據一組數據調整(額,好吧,這個際沒有隨機因為那是線面那個函數)
stocGradAscentWithDraw0(dataMatrix, classLabels)
上面的函數加強版,增加了一個weight跟著迭代次數的變化曲線
stocGradAscent1(dataMatrix, classLabels, numIter=150)
這就真的開始隨機了,隨機的主要好處是減少了周期性的波動了。另外這里還加入了alpha的值隨迭代變化,這樣可以讓alpha的值不斷的變化,但是都不會減小到0。
stocGradAscentWithDraw1(dataMatrix, classLabels, numIter=150)
上面的函數加強版,增加了一個weight跟著迭代次數的變化曲線
plotBestFit(wei)
根據計算的weight值畫出擬合的線,直觀觀察效果

運行效果分析:
1、梯度上升:
迭代變化趨勢
分類結果:
2、隨機梯度上升版本1
迭代變化趨勢
分類結果:
這個速度雖然快了很多但是效果不太理想啊。不過這個計算量那么少,我們如果把這個迭代200次肯定不一樣了,效果如下
果然好多了
3、隨機梯度上升版本2
迭代變化趨勢
分類結果:
恩,就是這樣啦,效果還是不錯的啦。代碼的畫圖部分寫的有點爛,見諒啦
  1.   1 #coding=utf-8
      2 from numpy import *
      3 
      4 def loadDataSet():
      5     dataMat = []
      6     labelMat = []
      7     fr = open('testSet.txt')
      8     for line in fr.readlines():
      9         lineArr = line.strip().split()
     10         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
     11         labelMat.append(int(lineArr[2]))
     12     return dataMat, labelMat
     13     
     14 def sigmoid(inX):
     15     return 1.0/(1+exp(-inX))
     16     
     17 def gradAscend(dataMatIn, classLabels):
     18     dataMatrix = mat(dataMatIn)
     19     labelMat = mat(classLabels).transpose()
     20     m,n = shape(dataMatrix)
     21     alpha = 0.001
     22     maxCycle = 500
     23     weight = ones((n,1))
     24     for k in range(maxCycle):
     25         h = sigmoid(dataMatrix*weight)
     26         error = labelMat - h
     27         weight += alpha * dataMatrix.transpose() * error
     28         #plotBestFit(weight)
     29     return weight
     30 
     31 def gradAscendWithDraw(dataMatIn, classLabels):
     32     import matplotlib.pyplot as plt
     33     fig = plt.figure()
     34     ax = fig.add_subplot(311,ylabel='x0')
     35     bx = fig.add_subplot(312,ylabel='x1')
     36     cx = fig.add_subplot(313,ylabel='x2')
     37     dataMatrix = mat(dataMatIn)
     38     labelMat = mat(classLabels).transpose()
     39     m,n = shape(dataMatrix)
     40     alpha = 0.001
     41     maxCycle = 500
     42     weight = ones((n,1))
     43     wei1 = []
     44     wei2 = []
     45     wei3 = []
     46     for k in range(maxCycle):
     47         h = sigmoid(dataMatrix*weight)
     48         error = labelMat - h
     49         weight += alpha * dataMatrix.transpose() * error
     50         wei1.extend(weight[0])
     51         wei2.extend(weight[1])
     52         wei3.extend(weight[2])
     53     ax.plot(range(maxCycle), wei1)
     54     bx.plot(range(maxCycle), wei2)
     55     cx.plot(range(maxCycle), wei3)
     56     plt.xlabel('iter_num')
     57     plt.show()
     58     return weight
     59     
     60 def stocGradAscent0(dataMatrix, classLabels):
     61     m,n = shape(dataMatrix)
     62     
     63     alpha = 0.001
     64     weight = ones(n)
     65     for i in range(m):
     66         h = sigmoid(sum(dataMatrix[i]*weight))
     67         error = classLabels[i] - h
     68         weight = weight + alpha * error * dataMatrix[i]
     69     return weight
     70     
     71 def stocGradAscentWithDraw0(dataMatrix, classLabels):
     72     import matplotlib.pyplot as plt
     73     fig = plt.figure()
     74     ax = fig.add_subplot(311,ylabel='x0')
     75     bx = fig.add_subplot(312,ylabel='x1')
     76     cx = fig.add_subplot(313,ylabel='x2')
     77     m,n = shape(dataMatrix)
     78     
     79     alpha = 0.001
     80     weight = ones(n)
     81     wei1 = array([])
     82     wei2 = array([])
     83     wei3 = array([])
     84     numIter = 200
     85     for j in range(numIter):
     86         for i in range(m):
     87             h = sigmoid(sum(dataMatrix[i]*weight))
     88             error = classLabels[i] - h
     89             weight = weight + alpha * error * dataMatrix[i]
     90             wei1 =append(wei1, weight[0])
     91             wei2 =append(wei2, weight[1])
     92             wei3 =append(wei3, weight[2])
     93     ax.plot(array(range(m*numIter)), wei1)
     94     bx.plot(array(range(m*numIter)), wei2)
     95     cx.plot(array(range(m*numIter)), wei3)
     96     plt.xlabel('iter_num')
     97     plt.show()
     98     return weight
     99     
    100 def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    101     m,n = shape(dataMatrix)
    102     
    103     #alpha = 0.001
    104     weight = ones(n)
    105     for j in range(numIter):
    106         dataIndex = range(m)
    107         for i in range(m):
    108             alpha = 4/ (1.0+j+i) +0.01
    109             randIndex = int(random.uniform(0,len(dataIndex)))
    110             h = sigmoid(sum(dataMatrix[randIndex]*weight))
    111             error = classLabels[randIndex] - h
    112             weight = weight + alpha * error * dataMatrix[randIndex]
    113             del(dataIndex[randIndex])
    114     return weight
    115     
    116 def stocGradAscentWithDraw1(dataMatrix, classLabels, numIter=150):
    117     import matplotlib.pyplot as plt
    118     fig = plt.figure()
    119     ax = fig.add_subplot(311,ylabel='x0')
    120     bx = fig.add_subplot(312,ylabel='x1')
    121     cx = fig.add_subplot(313,ylabel='x2')
    122     m,n = shape(dataMatrix)
    123     
    124     #alpha = 0.001
    125     weight = ones(n)
    126     wei1 = array([])
    127     wei2 = array([])
    128     wei3 = array([])
    129     for j in range(numIter):
    130         dataIndex = range(m)
    131         for i in range(m):
    132             alpha = 4/ (1.0+j+i) +0.01
    133             randIndex = int(random.uniform(0,len(dataIndex)))
    134             h = sigmoid(sum(dataMatrix[randIndex]*weight))
    135             error = classLabels[randIndex] - h
    136             weight = weight + alpha * error * dataMatrix[randIndex]
    137             del(dataIndex[randIndex])
    138             wei1 =append(wei1, weight[0])
    139             wei2 =append(wei2, weight[1])
    140             wei3 =append(wei3, weight[2])
    141     ax.plot(array(range(len(wei1))), wei1)
    142     bx.plot(array(range(len(wei2))), wei2)
    143     cx.plot(array(range(len(wei2))), wei3)
    144     plt.xlabel('iter_num')
    145     plt.show()
    146     return weight
    147     
    148 def plotBestFit(wei):
    149     import matplotlib.pyplot as plt
    150     weight = wei
    151     dataMat,labelMat = loadDataSet()
    152     dataArr = array(dataMat)
    153     n = shape(dataArr)[0]
    154     xcord1 = []
    155     ycord1 = []
    156     xcord2 = []
    157     ycord2 = []
    158     for i in range(n):
    159         if int(labelMat[i]) == 1:
    160             xcord1.append(dataArr[i,1])
    161             ycord1.append(dataArr[i,2])
    162         else:
    163             xcord2.append(dataArr[i,1])
    164             ycord2.append(dataArr[i,2])
    165     fig = plt.figure()
    166     ax = fig.add_subplot(111)
    167     ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    168     ax.scatter(xcord2, ycord2, s=30, c='green')
    169     x = arange(-3.0, 3.0, 0.1)
    170     y = (-weight[0] - weight[1]*x)/weight[2]
    171     ax.plot(x,y)
    172     plt.xlabel('X1')
    173     plt.ylabel('X2')
    174     plt.show()
    175     
    176 def main():
    177     dataArr,labelMat = loadDataSet()
    178     #w = gradAscendWithDraw(dataArr,labelMat)
    179     w = stocGradAscentWithDraw0(array(dataArr),labelMat)
    180     plotBestFit(w)
    181     
    182 if __name__ == '__main__':
    183     main()

    ?

    機器學習筆記索引

來自為知筆記(Wiz)



轉載于:https://www.cnblogs.com/MrLJC/p/4117805.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259696.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dataset轉換json格式

轉換json方法 public static string DataToJson(DataSet dt){StringBuilder jsonBuilder new StringBuilder();jsonBuilder.Append("{\"");jsonBuilder.Append("points");jsonBuilder.Append("\":[");for (int i 0; i < dt.Table…

《自控力》總結_完結

《自控力》總結_完結 《自控力》總結_完結 Saturday, December 15, 2012 9:35 PM 《自控力》總結 第一章 1 前額皮質的3個功能區域&#xff1a;“我要”“我不要”“我想要” 2 人的兩個自我&#xff1a;沖動的自己&#xff0c;控制自己。給兩個自己分別起名字&#xff0c;當某…

python 定時自動爬取_python實現scrapy爬蟲每天定時抓取數據的示例代碼

1. 前言。1.1. 需求背景。每天抓取的是同一份商品的數據&#xff0c;用來做趨勢分析。要求每天都需要抓一份&#xff0c;也僅限抓取一份數據。但是整個爬取數據的過程在時間上并不確定&#xff0c;受本地網絡&#xff0c;代理速度&#xff0c;抓取數據量有關&#xff0c;一般情…

博客園win8客戶端開發記錄5-app設置 登錄 回復評論

這段時間完成了博客園cnblogs登錄&#xff0c;注銷和設置的相關功能 &#xff0c;進入軟件&#xff0c; 打開win8的charm setting 選擇設置就是當前軟件的設置選項了&#xff0c; 感覺這有點山寨mac os x系統&#xff08;所有軟件包括當前系統使用統一的設置&#xff09;。 扯遠…

Oracle?修改SYS、system用戶密碼

Oracle 修改SYS、system用戶密碼 by:授客 QQ&#xff1a;1033553122 概念 SYS用戶是Oracle中權限最高的用戶&#xff0c;而SYSTEM是一個用于數據庫管理的用戶。在數據庫安裝完之后&#xff0c;應立即修改SYS,SYSTEM這兩個用戶的密碼&#xff0c;以保證數據庫的安全。 安裝完之…

春節小作業總結1

1、x Double.parseDouble(X);字符串轉Double類型&#xff1b; 2、使用正則表達式判斷輸入的是字母還是數字 要import java.util.regex.Pattern 和 java.util.regex.Matcher public boolean isNumeric(String str){ Pattern pattern Pattern.compile("[0-9]*&q…

簡單工廠模式,工廠方法模式,抽象工廠模式,spring的狂想

菜鳥D在項目中遇見一個比較糾結的高耦合&#xff0c;所以就想辦法來解耦。情況是這樣的&#xff1a;系統通過用戶選擇treeview控件的節點判斷調用不同的處理&#xff0c;這些處理中某些東西又是類似的。同事的建議是采用簡單工廠&#xff0c;耦合就耦合吧&#xff0c;反正treev…

堆、棧及靜態數據區詳解 轉

內存分為代碼區、全局數據區、堆區和棧區。堆一般存放動態數據&#xff0c;棧里一般存放局部成員。 關于堆棧和堆的概念[問題] C中創建本地&#xff08;或者說局域&#xff09;變量是在堆棧&#xff08;stack&#xff09;中分配內存地址&#xff0c;而創建全局變量則是在堆&…

如何使用CSS實現居中

前言&#xff1a; 這一篇主要是翻譯 《how-to-center-anything-with-css》這一篇文章的主要內容&#xff0c;再加上自己的一些概括理解&#xff1b;主要問題是解決垂直居中的問題。我們知道實現水平居中的方式很多種&#xff0c;比如&#xff1a; text-align:center; margin:0 …

java布局_運用 BoxLayout 進行 Swing 控件布局

引言在用戶使用 Java Swing 進行用戶界面開發過程中&#xff0c;會碰到如何對 Java Swing 的控件進行布局的問題。Swing 的控件放置在容器 (Container) 中&#xff0c;容器就是能夠容納控件或者其它容器的類&#xff0c;容器的具體例子有 Frame、Panel 等等。容器需要定義一個布…

js變量類型

js中有null和undefined&#xff0c;null是指對象不存在&#xff0c;undefined是指原生數據不存在 var h {name:lisi,age:28};console.log(h.name)//對象用的是點語法&#xff0c;php中是name->lisi 下面是數組&#xff0c;數組用的是【】語法 1 var arr [a,3,hello,true];…

OPENCV MFC 程序出錯修改

error C2146: 語法錯誤 : 缺少“;”(在標識符“PVOID64”的前面) 來源:http://houjixin.blog.163.com/blog/static/356284102009112395049370/ DirectShow 2009-12-23 09:50:49 閱讀311 評論0 字號&#xff1a;大中小打開winnt.h文件&#xff0c;發現問題就是在winnt.h頭文件中…

測試人員報BUG的正確姿勢

每次我提需求的時候&#xff0c;都會和開發一言不合就上BUG。曾經看到一個段子&#xff0c;告訴了我&#xff0c;吵架是不行滴&#xff01;影響心情&#xff0c;正確報bug的姿勢應該是這樣&#xff1a;不要對程序員說&#xff0c;你的代碼有BUG。他的第一反應是&#xff1a;1、…

java鏈表實現_鏈表的原理及java實現

一&#xff1a;單向鏈表基本介紹鏈表是一種數據結構&#xff0c;和數組同級。比如&#xff0c;Java中我們使用的ArrayList&#xff0c;其實現原理是數組。而LinkedList的實現原理就是鏈表了。鏈表在進行循環遍歷時效率不高&#xff0c;但是插入和刪除時優勢明顯。下面對單向鏈表…

python和django中的常見錯誤

int() argument must be a string or a number, not tupleError in formatting: coercing to Unicode: need string or buffer, int foundData truncated for column content at row 1sql語句中單引號的設置字段類型字段長度 ascii codec cant decode byte 0xe7 in position 0:…

20141126-解決聯網問題-筆記

當你的網絡出現故障或無法連通時&#xff0c;如何才能簡單高效的找出故障&#xff1f;其實只需要一個ping命令&#xff0c;就可以判斷TCP/IP協議故障…… 1、Ping 127.0.0.1&#xff1a; 127.0.0.1是本地循環地址&#xff0c;如果本地址無法Ping通&#xff0c;則表明本地機TCP/…

inittab腳本啟動解析 (zz)

http://blog.chinaunix.net/uid-17188120-id-4073497.html 1&#xff0c;啟動inittab第一步&#xff1a;啟動內核第二步&#xff1a;執行init &#xff08;配置文件/etc/inittab&#xff09;第三步&#xff1a;啟動相應的腳本&#xff0c;執行inittab腳本&#xff0c;并且執行其…

java緩存技術_java緩存技術

最近在做java緩存,了解了一下.以下僅是對map對方式討論。沒有對點陣圖陣討論。作緩存要做以下2點:1:清理及更新緩存時機的處理:. 虛擬機內存不足,清理緩存.. 緩存時間超時,或訪問次數超出, 啟動線程更新2:類和方法的反射 (線程嵌套調用)reflect.invoke的使用。代碼如下&#xf…

xss challenge 解題思路(1-3)

challenge1: 用很基本的方法即可&#xff0c;截圖如下&#xff1a; 提交后成功彈窗&#xff0c;完成。 challenge2 這次我們發現我們輸入的內容被放入value”“ 中&#xff0c;所以需要將前面的結構閉合&#xff0c;構造如下&#xff1a; "><script>alert(docume…

賓得準餅干廣角鏡頭DA15

DA15的掛機效果圖&#xff0c;感覺還是超級的小&#xff0c;是最小的廣角鏡頭了&#xff1a; 主要特點1. 超廣視角當安裝在賓得數碼單反相機上時&#xff0c;這款全新的鏡頭提供相當于35mm膠片規格的約23mm畫面視角&#xff0c;可使拍攝者拍攝出獨特的誘人影像和超廣角鏡頭獨有…