1. 程式人生 > >《機器學習實戰》--邏輯斯蒂迴歸

《機器學習實戰》--邏輯斯蒂迴歸

梯度下降視覺化

前一篇看完了理論,我們來實戰一下,首先看一下梯度下降的效果
先看程式碼

# 目標函式
def func(x):
    return np.square(x)

# 目標函式一階導數
def dfunc(x):
    return 2 * x

def GD_momentum(x_start, df, epochs, lr, momentum):
    xs = np.zeros(epochs+1)
    x = x_start
    xs[0] = x
    v = 0
    for i in range(epochs):
        dx = df(x)
        v = -dx * lr + momentum * v # 計算w需要更新的值
x += v xs.append(x) # 把新的x儲存下來 return xs

上面的程式碼就是首先定義了一個目標函式,然後定義了目標函式的一階導數,最後我們利用梯度下降演算法更新引數,並把每次新的引數儲存起來,已被畫圖,最終的結果就是如下所示:
梯度下降示意圖
我們可以看到新的引數取值是逐漸趨向於使目標函式最小化。看完了梯度下降,我們來做做一個二分類的小實驗。首先我們看一下資料,
這裡寫圖片描述
前兩列是特徵,第三列是label,每一行就是一個樣本。
  首先我們看一下資料的分佈。

import  numpy as np
import
matplotlib.pyplot as plt %matplotlib inline np.random.seed(1234) # 載入資料 def loaddata(): dataMat = [] labelMat = [] for line in open('./data.txt', 'r'): line = line.strip().split() dataMat.append([1.0, float(line[0]), float(line[1])]) labelMat.append(int(line[2])) return
dataMat, labelMat # 顯示散點圖 def plotDataSet(): data, label = loaddata() data = np.array(data) xcord1 = [] ycord1 = [] xcord2 = [] ycord2 = [] for i in range(data.shape[0]): if int(label[i]) == 1: xcord1.append(data[i, 1]) ycord1.append(data[i, 2]) else: xcord2.append(data[i, 1]) ycord2.append(data[i, 2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker='s', alpha = 0.5) ax.scatter(xcord2, ycord2, s = 20, c = 'green', alpha = 0.5) plt.title('DataSet') plt.xlabel('X1') plt.ylabel('Y1') plt.show()

我們看一下資料的分佈,如圖所示:
這裡寫圖片描述

  從圖上可以看出,資料的分佈很明顯,可以很輕鬆的分開。我們需要一個z=w1x1+w2x2+w3x3 來表示這個分割線,三個引數就可以搞定,我們在讀入資料的時候把x0設為1,那w1就相當於b了。我們採用梯度下降演算法來獲得最佳的引數,

def sigmoid(inX):
    return 1.0 / (1 + np.exp(-inX))

def gradAscent(data, label):
    data = np.mat(data)
    label = np.mat(label).transpose()
    alpha = 0.0001
    maxEpoch = 700
    m, n = np.shape(data)
    weights = np.ones((n, 1))
    for i in range(maxEpoch):
        h = sigmoid(data * weights)
        error = -(label - h)
        weights = weights - alpha * data.transpose() * error
    return weights.getA()

# 繪製結果
def plotBestFit(weights):
    dataMat, labelMat = loaddata()                                    
    dataArr = np.array(dataMat)                                            
    n = np.shape(dataMat)[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 = 20, c = 'red', marker = 's',alpha=.5)
    ax.scatter(xcord2, ycord2, s = 20, c = 'green',alpha=.5)
    x = np.arange(-3.0, 3.0, 0.1)
    y = (-weights[0] - weights[1] * x) / weights[2]
    ax.plot(x, y)
    plt.title('BestFit')                                                         
    plt.xlabel('X1'); plt.ylabel('X2')                                    
    plt.show() 

  根據我們求出的引數,劃出分割界限:

這裡寫圖片描述

相關推薦

統計學習方法邏輯迴歸

邏輯斯諦迴歸(logistic regression) 是統計學習中的經典分類方法。 最大熵是概率模型學習的一個準則, 將其推廣到分類問題得到最大熵模型(maximum entropy model) 。邏輯斯諦迴歸模型與最大熵模型都屬於對數線性模型。本文只介紹邏輯斯諦迴歸。 設X是連續隨機變數, X

機器學習實戰》第5章邏輯迴歸數學推導

在《機器學習實戰》一書的第5章邏輯斯蒂迴歸的程式碼介紹中,p79中開頭有一句,“此處略去了一個簡單的數學推導”,那麼到底略去了哪一個簡單的數學推導呢?本著要將這個演算法徹底搞明白的態度,筆者在百度上搜了好多資料,終於找到了相關的資料,以供參考。 從上圖中按照邏輯斯蒂迴歸演算法,利用梯

機器學習實戰》--邏輯迴歸

梯度下降視覺化 前一篇看完了理論,我們來實戰一下,首先看一下梯度下降的效果 先看程式碼 # 目標函式 def func(x): return np.square(x) # 目標函式一階導數 def dfunc(x): return 2

機器學習實戰》-- 邏輯迴歸

引言   迴歸我們知道有線性迴歸,線性迴歸模型能夠無限的逼近我們的結果。以(xi,yi)為例,通過線性迴歸 f(x)=wTx+b表示式,就可以得到我們對yi的估計值。 迴歸到分類   如何從線性迴歸轉換到分類呢?由於線性迴歸得到的是連續值,z=wTx+b,

機器學習筆記:線性迴歸邏輯迴歸推導

參考書籍:《統計學習方法》,cs229,其他 1、線性迴歸 1.1、線性迴歸表示 線性迴歸屬於監督學習問題,輸入X與輸出Y成線性關係,只要我們得到了這個具體的關係,那麼對於待預測的資料X我們便可以知道Y的值。現在就來求這個線性關係 先定義好變量表示。記輸入變量表示為

機器學習筆記(一) 邏輯迴歸LR

本文是在學習完李航老師的《統計學習方法》後,在網上又學習了幾篇關於LR的部落格,算是對LR各個基礎方面的一個回顧和總結。 一 簡述   邏輯斯蒂迴歸是一種對數線性模型。經典的邏輯斯蒂迴歸模型(LR

機器學習 sklearn】邏輯迴歸模型--Logistics regression

執行結果: "D:\Program Files\Python27\python.exe" D:/PycharmProjects/sklearn/Logistics_regression.py Logistics regression [[99 1] [

統計學習---邏輯迴歸與最大熵模型

邏輯斯蒂迴歸和最大熵模型 邏輯斯蒂分佈 邏輯斯蒂迴歸模型 將權值向量和輸入向量加以擴充後的邏輯斯蒂模型為 模型引數估計 極大似然估計法 最大熵模型 最大熵原理:在所有可能的概率模型中,熵最大的模型是最好的模型。通常用約

《統計學習方法(李航)》邏輯迴歸與最大熵模型學習筆記

作者:jliang https://blog.csdn.net/jliang3   1.重點歸納 1)線性迴歸 (1)是確定兩種或以上變數間相互依賴的定量關係的一種統計分析方法。 (2)模型:y=wx+b (3)誤差函式: (4)常見求解方法 最小

sklean學習之LogisticRegression(邏輯迴歸分類器)【原始碼】

def fit(self, X, y, sample_weight=None):        """根據給定的訓練資料擬合模型.       引數        ----------        X : {array-like, sparse matrix}, shape (n_samples, n_fe

李航·統計學習方法筆記·第6章 logistic regression與最大熵模型(1)·邏輯迴歸模型

第6章 logistic regression與最大熵模型(1)·邏輯斯蒂迴歸模型 標籤(空格分隔): 機器學習教程·李航統計學習方法 邏輯斯蒂:logistic 李航書中稱之為:邏輯斯蒂迴歸模型 周志華書中稱之為:對數機率迴歸模

Hinton Neural Networks課程筆記3c:學習邏輯迴歸

這節可以看做反向傳播(BP)演算法在邏輯斯蒂迴歸(logistic regression)中的應用。 為了進一步拓展BP演算法的應用,從線性神經元拓展到了非線性神經元。這裡選取了最簡單的非線性神經元:邏輯斯蒂輸出神經元(logistic output ne

《統計學習方法》1——邏輯迴歸

1. 模型 二項邏輯斯蒂迴歸模型是由邏輯斯蒂分佈的條件概率分佈表示的分類模型。 邏輯斯蒂分佈函式為 其中,u是位置引數,是中心點(對稱點)的位置;r是形狀函式。 其分佈圖形是一條S形曲線,也就是sigmoid曲線,S形曲線的範圍是(0,1)。

機器學習實戰筆記4—Logistic迴歸

注:此係列文章裡的部分演算法和深度學習筆記系列裡的內容有重合的地方,深度學習筆記裡是看教學視訊做的筆記,此處文章是看《機器學習實戰》這本書所做的筆記,雖然演算法相同,但示例程式碼有所不同,多敲一遍沒有壞處,哈哈。(裡面用到的資料集、程式碼可以到網上搜索,很容易找到。)。Python版本3.6

機器學習實戰程式碼_Python3.6_Longistic迴歸

import math import numpy as np import matplotlib.pyplot as plt def load_data_set(): data_mat = [] label_mat = [] fr =

邏輯斯蒂迴歸能否解決非線性分類問題? 邏輯斯蒂迴歸提出時用來解決線型分類問題,其分離面是一個線型超平面wx+b,如果將這個超平面改成非線性的,如x1^2+x2=0之類的非線性超平面來進行分類,是否也可

邏輯迴歸的模型引入了sigmoid函式對映,是非線性模型,但本質上又是一個線性迴歸模型,因為除去sigmoid對映函式關係,其他的步驟,演算法都是線性迴歸的。可以說,邏輯迴歸,都是以線性迴歸為理論支援的。 這裡講到的線性,是說模型關於係數一定是線性形式的 加入sigmoid對

機器學習實戰-邏輯回歸

one har 改進 lin [] readlines 機器 iter sun 邏輯回歸:簡單的來說,在線性回歸的基礎上加入了Sigmoid函數! import numpy as np import matplotlib.pyplot as plt from matp

機器學習3 邏輯提回歸和梯度下降演算法

引言 上節我們介紹了很多線性迴歸模型,如何用線性模型做分類任務呢?是不是可以將線性迴歸模型的預測值和到分類任務的標記聯絡起來呢? 邏輯斯提回歸 對於一個二分類任務,輸出標記y為{0,1},而線性迴歸模型產生的預測值z為全體實數,我們想把z轉換成0/1值。我們首先想到是“單位階躍函式”。

邏輯迴歸用sigmoid函式的原因?

sigmoid函式的數學公式                  sigmoid函式的因變數x取值範圍是-∞到+∞,(-∞,+∞),但是sigmoid函式的值域是(0, 1)。 不管x取什麼值其對應的sigmoid函式值一定會落到(0,1)範圍內~~~ 漂亮的logis

機器學習實戰——python實現Logistic迴歸

簡介 Logistic迴歸的目的是尋找一個非線性函式Sigmoid的最佳擬合引數,一般使用梯度上升演算法。 對於有n個屬性的train資料集(X1,X2,...Xn),我們尋找一組迴歸係數(W0,W1