機器學習——邏輯回歸

2021-03-02 大數據技術宅

通過散點圖,觀察一下數據點的空間分布情況,代碼如下:

1
2
3from numpy import *
4import matplotlib.pyplot as plt  
5
6def loadData():  
7    train_x = []  
8    train_y = []  
9    fileIn = open('testSet.txt')
10    for line in fileIn.readlines():  
11        lineArr = line.strip().split()  
12        train_x.append([1.0, float(lineArr[0]), float(lineArr[1])])  
13        train_y.append(float(lineArr[2]))
14    return mat(train_x), mat(train_y).transpose()  
15
16train_x,train_y= loadData()
17for i in xrange(100):  
18    if int(train_y[i, 0]) == 0:  
19        plt.plot(train_x[i, 1], train_x[i, 2], 'or')  
20    elif int(train_y[i, 0]) == 1:  
21        plt.plot(train_x[i, 1], train_x[i, 2], 'ob')
22min_x = min(train_x[:, 1])[0, 0]  
23max_x = max(train_x[:, 1])[0, 0]
24plt.xlabel('X1'); plt.ylabel('X2')  
25plt.show()

運行python腳本畫出來的測試數據的散點圖如圖3所示:

圖3 測試數據散點圖

從圖3中,可以看出測試數據基本可以通過一條直線進行分隔,下邊筆者的邏輯回歸python代碼將通過用一條直線將數據分成兩部分,代碼中的優化算法可以選擇梯度下降法、隨機梯度下降和平滑梯度下降三種方法。模型的代碼如下(讀者可將模型代碼複製入logic.py文件中):

1from numpy import *  
2import matplotlib.pyplot as plt  
3import time  
4
5
6def sigmoid(inX):  
7    return 1.0 / (1 + exp(-inX))  
8
9
10
11
12
13
14def trainLogRegres(train_x, train_y, opts):  
15    
16    startTime = time.time()  
17
18    numSamples, numFeatures = shape(train_x)  
19    alpha = opts['alpha']; maxIter = opts['maxIter']  
20    weights = ones((numFeatures, 1))  
21
22    
23    for k in range(maxIter):                          
24        if opts['optimizeType'] == 'gradDescent':
25            output = sigmoid(train_x * weights)
26            error = train_y - output  
27            weights = weights + alpha * train_x.transpose() * error  
28        elif opts['optimizeType'] == 'stocGradDescent':
29            for i in range(numSamples):  
30                output = sigmoid(train_x[i, :] * weights)  
31                error = train_y[i, 0] - output  
32                weights = weights + alpha * train_x[i, :].transpose() * error  
33        elif opts['optimizeType'] == 'smoothStocGradDescent':
34          
36            for i in range(numSamples):  
37                alpha = 4.0 / (1.0 + k + i) + 0.01  
38                randIndex = int(random.uniform(0, len(dataIndex)))  
39                output = sigmoid(train_x[randIndex, :] * weights)  
40                error = train_y[randIndex, 0] - output  
41                weights = weights + alpha * train_x[randIndex, :].transpose() * error  
42                del(dataIndex[randIndex])
43        else:  
44            raise NameError('Not support optimize method type!')  
45
46
47    print 'Congratulations, training complete! Took %fs!' % (time.time() - startTime)  
48    return weights  
49
50
51
52
53def testLogRegres(weights, test_x, test_y):  
54    numSamples, numFeatures = shape(test_x)  
55    matchCount = 0  
56    for i in xrange(numSamples):  
57        predict = sigmoid(test_x[i, :] * weights)[0, 0] > 0.5  
58        if predict == bool(test_y[i, 0]):  
59            matchCount += 1  
60    accuracy = float(matchCount) / numSamples  
61    return accuracy  
62
63
64
65
66def showLogRegres(weights, train_x, train_y):  
67    
68    numSamples, numFeatures = shape(train_x)  
69    if numFeatures != 3:  
70        print "Sorry! I can not dra 
71        return 1  
72
73    
74    for i in xrange(numSamples):  
75        if int(train_y[i, 0]) == 0:  
76            plt.plot(train_x[i, 1], train_x[i, 2], 'or')  
77        elif int(train_y[i, 0]) == 1:  
78            plt.plot(train_x[i, 1], train_x[i, 2], 'ob')  
79
80    
81    min_x = min(train_x[:, 1])[0, 0]  
82    max_x = max(train_x[:, 1])[0, 0]  
83    weights = weights.getA()  
84    y_min_x = float(-weights[0] - weights[1] * min_x) / weights[2]  
85    y_max_x = float(-weights[0] - weights[1] * max_x) / weights[2]  
86    plt.plot([min_x, max_x], [y_min_x, y_max_x], '-g')  
87    plt.xlabel('X1'); plt.ylabel('X2')  
88plt.show()

對代碼的分類效果進行測試,測試代碼如下(讀者可將測試代碼複製入test_logic.py文件中):

1from numpy import *  
2import matplotlib.pyplot as plt  
3import time  
4import logic as logic
5
6def loadData():  
7    train_x = []  
8    train_y = []  
9    
10    fileIn = open('testSet.txt')  
11    for line in fileIn.readlines():  
12        lineArr = line.strip().split()  
13        train_x.append([1.0, float(lineArr[0]), float(lineArr[1])])  
14        train_y.append(float(lineArr[2]))  
15    return mat(train_x), mat(train_y).transpose()  
16  
17
18print "step 1: load data..."  
19train_x, train_y = loadData()  
20
21
22test_x = train_x; test_y = train_y  
23
24print "step 2: training..."  
25opts = {'alpha': 0.01, 'maxIter': 5, 'optimizeType': 'smoothStocGradDescent'}
26
27optimalWeights = logic.trainLogRegres(train_x, train_y, opts)  
28
29print optimalWeights
30
31print "step 3: testing..."  
32accuracy = logic.testLogRegres(optimalWeights, test_x, test_y)  
33
34print "step 4: show the result..."    
35print 'The classify accuracy is: %.3f%%' % (accuracy * 100)  
36logic.showLogRegres(optimalWeights, train_x, train_y)

運行測試代碼test_logic.py,測試結果如圖4所示:

圖4 邏輯回歸線性分類效果

筆者統計了一下,在迭代5次的情況下,線性分類的正確率為96%。讀者可以通過複製代碼,自行的進行測試,也可以將線性分類改變成曲線形式,去測一下分類效果。在這篇文章中筆者簡單介紹了一下邏輯回歸的原理,並且給出了實現的代碼以供讀者直觀學習體驗。在下一篇,本公眾號中關於機器學習文章中,筆者將詳細的介紹支持向量機SVM的原理,並附上python實現的代碼。

下篇:

相關焦點

  • 機器學習入門3 ——感知器和邏輯回歸
    此外,我們將討論感知器算法的兄弟,邏輯回歸。有監督和無監督算法在機器學習中,有兩種通用的算法。在上一篇文章中我們討論了回歸和分類。這兩種方法均屬於有監督學習算法的大範圍之內,監督學習算法是兩類機器學習算法之一。 另一類算法稱為無監督算法。
  • ...實現機器學習之邏輯回歸:邏輯回歸介紹、應用場景、原理、損失...
    作者 | 汪雯琦責編 | Carol來源 | CSDN 博客學習目標知道邏輯回歸的損失函數知道邏輯回歸的優化方法知道sigmoid函數知道邏輯回歸的應用場景應用LogisticRegression實現邏輯回歸預測知道精確率、召回率指標的區別知道如何解決樣本不均衡情況下的評估了解
  • 簡單粗暴理解與實現機器學習之邏輯回歸:邏輯回歸介紹、應用場景...
    知道邏輯回歸的優化方法知道sigmoid函數知道邏輯回歸的應用場景應用LogisticRegression實現邏輯回歸預測知道精確率、召回率指標的區別邏輯回歸(Logistic Regression)是機器學習中的一種分類模型,邏輯回歸是一種分類算法,雖然名字中帶有回歸,但是它與回歸之間有一定的聯繫。
  • 文科生都能看懂的機器學習教程:梯度下降、線性回歸、邏輯回歸
    現在,機器學習這麼火,想入行的人越來越多,然而被搞糊塗的人也越來越多。因為大眾很難理解機器學習是幹嗎的?那些神秘拗口的概念,比如邏輯回歸、梯度下降到底是什麼?j  一個23歲的藥物學專業的學生說,當他去參加機器學習培訓課程的時候,感覺自己就家裡那位不懂現代科技的奶奶。
  • 數據科學&機器學習的筆記1:分類、線性回歸和邏輯回歸
    第五章開了個頭,講的是「選擇和評價模型」,大抵是介紹機器學習中的常用模型,分清遇到不同數據分析需求時適用的模型。令我失望的是,真的真的只是講了一下模型的種類,告訴你模型可以用來做什麼,連一點點原理都沒有涉及。我希望今天把課程所學溫習,把上學期的實踐課學到的機器學習原理整合進知識框架裡,順道把之前的筆記好好整理一下。
  • 機器學習|劉老師專欄—從邏輯回歸到支持向量機(一)
    需要複習邏輯回歸?請戳:機器學習|劉老師專欄——機器的「是非觀」機器學習|劉老師專欄——機器學習與是非題(二)機器學習|劉老師專欄——關於邏輯回歸的更多思考既然之前我一直在介紹邏輯回歸,在這篇文章裡,我就從那裡開始。01二分類問題的目的是使用一些變量X來判斷樣本的標籤Y。在邏輯回歸的思路下,變量X的線性組合X*b(b是係數向量),通過sigmoid函數變換為概率p(標籤Y的取值為1的概率)。
  • 教程丨機器學習算法:從頭開始構建邏輯回歸模型
    邏輯回歸是繼線性回歸之後最著名的機器學習算法。在很多方面,線性回歸和邏輯回歸是相似的,不過最大的區別在於它們的用途,線性回歸算法用於預測,但邏輯回歸用於分類任務。分類任務很常見,比如把電子郵件分為垃圾郵件和非垃圾郵件、把腫瘤分為惡性或者良性、把網站分為危險站點或正常站點,機器學習算法就可以完成這些任務。
  • 機器學習中的邏輯回歸
    Classification and Representation要嘗試分類,一種方法是使用線性回歸,並將所有大於0.5的預測值映射為1,將小於0.5的所有預測值映射為0.但是,此方法效果不佳,因為分類實際上不是線性函數。分類問題就像回歸問題一樣,除了我們現在想要預測的值只有少數離散值。
  • 邏輯回歸算法學習與思考
    from http://blog.csdn.net/dongtingzhizi本文是作者對於邏輯回歸算法的學習和思考,主要介紹:邏輯回歸的算法介紹、邏輯回歸的數學原理、邏輯回歸的實際應用、邏輯回歸的總結以及網絡安全場景預測,歡迎大家參考討論。
  • 入門機器學習之線性回歸
    【一元線性回歸和多元線性回歸】的區別在於,多元線性回歸有(>1)個自變量,而一元線性回歸通常只有1個自變量。現在的問題是「我們如何得到一個最佳的擬合線呢?」。2、Logistic Regression邏輯回歸邏輯回歸是用來計算「事件=Success」和「事件=Failure」的概率。
  • 邏輯回歸實現情感分析
    本文參考於吳恩達NLP專項課程—有監督學習 & 情感分析在有監督機器學習中,你需要有輸入特徵
  • 什麼是邏輯回歸?
    邏輯回歸(Logistic Regression,也譯作「對數機率回歸」)是離散選擇法模型之一,屬於多重變量分析範疇,是社會學、生物統計學、臨床、數量心理學、計量經濟學、市場營銷等統計實證分析的常用方法。邏輯回歸一般用於二分類(Binary Classification)問題中,給定一些輸入,輸出結果是離散值。
  • 邏輯回歸(Logistic Regression) 模型簡介
    本文作為美團機器學習InAction系列中的一篇,主要關注邏輯回歸算法的數學模型和參數求解方法,最後也會簡單討論下邏輯回歸和貝葉斯分類的關係,以及在多分類問題上的推廣。特徵工程在任何一個實用的機器學習系統中都是必不可少的,機器學習InAction系列已有一篇文章中對此做了詳細的介紹,本文不再詳細展開。模型sigmoid 函數在介紹邏輯回歸模型之前,我們先引入sigmoid函數,其數學形式是:
  • 用邏輯回歸來進行分類
    邏輯回歸是機器學習中經常用到的一種方法,其屬於有監督機器學習,邏輯回歸的名字雖然帶有「回歸」二字,但實際上它卻屬於一種分類方法,本文就介紹一下如何用邏輯回歸進行分類。首先還是介紹一下邏輯回歸的基本原理。
  • 廣義線性模型與邏輯回歸
    分類問題是機器學習中常見的一種方法,本文將以二分類為切入點,引出邏輯回歸模型。
  • 用Python實現機器學習算法:邏輯回歸
    邏輯回歸
  • 邏輯回歸
    [本篇以《機器學習.周志華3.3》為上下文]我要用線性回歸來分類 線性回歸尋找一堆統計樣本後面隱藏的規律。
  • 7分鐘搞懂邏輯回歸的來龍去脈
    大多數教程都是從定義和原理出發,來講解邏輯回歸,容易顯得晦澀難懂。本文將結合實例和圖示,幫助讀者在7分鐘內搞懂邏輯回歸算法。功能邏輯回歸一般用於二分類任務,並能給出兩個類的相應概率。常見的應用包括垃圾郵件判別、銀行判斷是否給用戶貸款等等。當然,二分類問題可以擴展到多分類問題。
  • 乾貨|簡單理解邏輯回歸基礎
    點擊上方「AI遇見機器學習」,選擇「星標」公眾號原創乾貨
  • 機器學習套路:線性回歸
    (點擊上方藍字,快速關注我們)轉自:sharkdtuhttp://sharkdtu.com/posts/ml-linear-regression.html好文投稿, 請點擊 → 這裡了解詳情線性回歸可以說是機器學習中最簡單