第196講 Python——線性模型|邏輯回歸|算法

2021-12-29 小叮噹講SAS和Python

們在講機器學習模型之前,首先要了解兩個最簡單的機器學習或統計學習模型,那就是線性模型和邏輯回歸。其中最小二乘法是解決線性模型擬合的一種思想,最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。


基本原理

設(x,y)是一對觀測量,且 滿足以下的理論函數

為了尋找最優估計值,求解目標函數

1.線性模型python 程序實現:

'''
1.線性模型
@date: 2021-10-14
@author: Alan
'''

import numpy as np

def forward(x,w):
    return w*x

def loss(x,y,w):
    y_pred = forward(x, w)
    error = (y_pred - y)**2
    return error

def gradient_desent(x_train,y_train):    
    i = 0      # 訓練次數
    w = 0.0    # 初始化權重參數
    error = 1e-4  
    list_w = []
    list_mse = []
    while True:
        loss_sum = 0.0
        k=0
        while (k<len(x_train)): # for x, y in zip(x_train, y_train):
            x = x_train[k]
            y = y_train[k]
            loss_val = loss(x,y,w)
            loss_sum += loss_val
            k = k + 1
        mse = loss_sum/len(x_train) # 均方根誤差
        print('第'+str(i)+'次訓練更新後均方根誤差mse:', mse)
        if mse<error: # 收斂準則
            print('達到收斂準則,退出訓練!')
            break
        w = w + 0.1  #更新權重
        i = i + 1    #更新迭代次數
        list_w.append(w)
        list_mse.append(mse)

    print('最優權重w為:',w)
    return w, list_w, list_mse


x_train = [1,2,3,4,5]
y_train = [2,4,6,8,10]

w, list_w, list_mse = gradient_desent(x_train,y_train)

import matplotlib.pyplot as plt
plt.plot(list_w,list_mse,color='#F92672')
plt.xlabel('w')
plt.ylabel('MSE')
plt.show()

日誌輸出:

第0次訓練更新後均方根誤差mse: 44.0
第1次訓練更新後均方根誤差mse: 39.71
第2次訓練更新後均方根誤差mse: 35.64
第3次訓練更新後均方根誤差mse: 31.79
第4次訓練更新後均方根誤差mse: 28.160000000000004
第5次訓練更新後均方根誤差mse: 24.75
第6次訓練更新後均方根誤差mse: 21.56
第7次訓練更新後均方根誤差mse: 18.59
第8次訓練更新後均方根誤差mse: 15.840000000000003
第9次訓練更新後均方根誤差mse: 13.310000000000002
第10次訓練更新後均方根誤差mse: 11.000000000000004
第11次訓練更新後均方根誤差mse: 8.910000000000002
第12次訓練更新後均方根誤差mse: 7.040000000000001
第13次訓練更新後均方根誤差mse: 5.389999999999999
第14次訓練更新後均方根誤差mse: 3.959999999999998
第15次訓練更新後均方根誤差mse: 2.749999999999998
第16次訓練更新後均方根誤差mse: 1.7599999999999973
第17次訓練更新後均方根誤差mse: 0.9899999999999973
第18次訓練更新後均方根誤差mse: 0.43999999999999817
第19次訓練更新後均方根誤差mse: 0.10999999999999857
第20次訓練更新後均方根誤差mse: 2.0904813988356812e-30
達到收斂準則,退出訓練!
最優權重w為: 2.0000000000000004


logistic回歸是一種廣義的線性回歸分析模型,其實是分類模型,常用於數據挖掘,疾病自動診斷,經濟預測等領域。例如,探討臨床試驗過程中引發疾病的危險因素,並根據危險因素預測疾病發生的概率等。


背景:Sigmoid函數是一個在生物學中常見的S型的函數,也稱為S型生長曲線。Sigmoid函數常被用作神經網絡的閾值函數,將變量映射到0,1之間。

計算的概率用於預測邏輯回歸模型中的目標分類,我們經常聽到的兩個主要函數是Softmax和Sigmoid函數。深度學習和其他領域的功能使用中起著至關重要的作用。

Logistic分布函數


2.邏輯回歸模型 python 程序實現:

import time
import math
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#(1)np.dot()對於這兩種數據格式均為矩陣乘法;
#(2)np.multiply()對於這兩種數據格式均為按元素相乘;
#(3)符號「*」對於array類型是矩陣乘法,
#對於mat類型是按元素類型相乘,
#而當一個array類型乘上一個mat類型時,則為矩陣乘法;


# sigmoid函數
def sigmoid(x):
    return 1.0 / (1 + math.exp(-x))

def loadData(dataset):
    # dataset = "./excel/testSet.xlsx"
    df = pd.read_excel(dataset, sheet_name='Sheet1')
    x_train = np.mat(df.iloc[:, 0:3])
    y_train = np.mat(df.iloc[:, [3]])
    return x_train, y_train

def logRegression(x_train, y_train):
    
    # 循環變量
    k = 0
    # 最大迭代次數
    maxiter = 100
    # 迭代步長
    alpha = 0.01
    # 獲取訓練樣本數與特徵數
    numSamples, numFeatures = np.shape(x_train)
    # 梯度初始化參數為1x3數組向量
    gradient = np.zeros((numFeatures, 1))
    
    while (k < maxiter):
        k = k + 1                               # k指代的是迭代更新之後的k
        alpha = 4.0 / (1.0 + k) + 0.01          # 步長的更新
        i = np.random.randint(0, numSamples) # 隨機取一個樣本
        x_vector = x_train[i, :] # 隨機的一個樣本向量
        y_vector = y_train[i, 0] # 隨機的一個樣本標籤(0或1)
        # sigmoid函數 S形曲線作為打分函數,值域為(0,1)
        y_score = sigmoid(np.dot(x_vector, gradient)) # 矩陣輸入: 矩陣乘以數組(Gradient vector)
        error = y_vector - y_score # 損失函數:真是y值 - 預測的y值
        # 梯度 gradient = gradient + 步長*誤差
        gradient = gradient + alpha * error * x_vector.T
        print('*' + 100 * "-")
        print("步長: ", alpha)
        print("第{0}個樣本: ".format(i))
        print("第{0}個樣本X特徵: {1}".format(i, x_vector))
        print("第{0}個樣本y值: {1}".format(i, y_vector))
        print("第{0}個樣本矩陣:{1} 乘以\n數組:{2}".format(i,x_vector, gradient))
        print("第{0}個樣本點乘積{1}".format(i, x_vector*gradient))
        print("第{0}個樣本sigmoid值: {1}".format(i, y_score))
        print("第{0}次誤差: {1}".format(k, error))
        print("第{0}次梯度: \n {1}".format(k, gradient))
        print('*' + 100 * "-")
        #time.sleep(5)
        print()
        
    return gradient


# return (TP + TN)
def TPTN(x_train, y_train, delta, cutoff=0.5):
    TP = 0  # 記錄劃分真陽性的樣本=TP
    TN = 0  # 記錄劃分真陰性的樣本=TN
    # TPTN = TP + TN # 記錄劃分正確的樣本=TP+TN
    numSamples, numFeatures = np.shape(x_train) # 獲取訓練樣本的規模
    for i in range(numSamples):
        p = sigmoid(x_train[i, :] * delta)
        if p >= cutoff and int(y_train[i, 0]) == 1:
            TP = TP + 1
        elif p < cutoff and y_train[i, 0] == 0:
            TN = TN + 1
    return TP + TN


def showGraph(x_train, y_train, delta):
    numSamples, numFeatures = np.shape(x_train) # 獲取訓練樣本的規模
    
    # 創建畫布
    plt.figure(figsize=(12, 8)) # 設置繪製尺寸
    
    # 樣本點
    for i in range(numSamples):
        if int(y_train[i, 0]) == 0:
            plt.plot(x_train[i, 1], x_train[i, 2], 'or')
        elif int(y_train[i, 0]) == 1:
            plt.plot(x_train[i, 1], x_train[i, 2], 'ob')
            
    # 繪製分割線
    min_x = min(x_train[:, 1])[0, 0] - 1
    max_x = max(x_train[:, 1])[0, 0] + 1
    y_min_x = float(-delta[0, 0] - delta[1, 0] * min_x) / delta[2, 0]
    y_max_x = float(-delta[0, 0] - delta[1, 0] * max_x) / delta[2, 0]
    
    plt.plot([min_x, max_x], [y_min_x, y_max_x], color='r')
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()


def testingLogR(dataset):
    global gra
    # 返回的X特徵,Y標籤,存在矩陣裡面
    x_train, y_train = loadData(dataset)
    max_TPTN = 0.0
    numBegin = 20  # 起點數量
    for i in range(numBegin):
        
        gradient = logRegression(x_train, y_train)
        TPTN_count = TPTN(x_train, y_train, gradient)
        
        if TPTN_count > max_TPTN:
            max_TPTN = TPTN_count
            gra = gradient
            
    numSamples, numFeatures = np.shape(x_train)
    print("樣本準確率為Accuracy=(TP+TN)/N:", (max_TPTN/numSamples)*100, "%")
    showGraph(x_train, y_train, gra)

testingLogR(dataset="./excel/testSet.xlsx")


相關焦點

  • 線性模型(三)邏輯回歸
    邏輯回歸用戶是否會點擊廣告、貸款是否會逾期等這種二分因變量取值一般定義為0和1(一般把關注的事件編碼為1)或+1和-1,對於這類問題可以使用邏輯回歸建模模型原理拋硬幣的隨機事件中,拋一次硬幣的結果可能是正面或反面,設正面表示為1,概率為p,則該隨機事件屬於
  • 廣義線性模型與邏輯回歸
    所以我們無法直接採用線性回歸模型進行建模。對於這一類問題,可以用邏輯回歸來處理。在講邏輯回歸之前,先簡單介紹下指數族分布、廣義線性模型,因為邏輯回歸是廣義線性模型的一種,所以我們需要了解如何從廣義線性模型得到邏輯回歸。二、指數族分布之所以先介紹指數族分布,因為指數族分布是所有廣義線性模型的假設條件之一。
  • python機器學習--線性回歸
    python機器學習--線性回歸線性回歸是最簡單的機器學習模型,其形式簡單,易於實現,同時也是很多機器學習模型的基礎。對於一個給定的訓練集數據,線性回歸的目的就是找到一個與這些數據最吻合的線性函數。針對線性回歸算法在之前的數模案例也有涉及喔,歡迎去看看上一篇博客數學建模預測模型實例--大學生體測數據模型在這裡插入圖片描述OLS線性回歸Ordinary Least Squares 最小二乘法一般情況下,線性回歸假設模型為下,其中w為模型參數
  • 模型之母:多元線性回歸
    0x00 前言 在線性回歸的前3篇中,我們介紹了簡單線性回歸這種樣本只有一個特徵值的特殊形式,並且了解了一類機器學習的建模推導思想,即:然後通過最優化損失函數或者效用函數,獲得機器學習的模型。然後我們推導並實現了最小二乘法,然後實現了簡單線性回歸。最後還以簡單線性回歸為例,學習了線性回歸的評價指標:均方誤差MSE、均方根誤差RMSE、平均絕對MAE以及R方。
  • 邏輯回歸算法學習與思考
    from http://blog.csdn.net/dongtingzhizi本文是作者對於邏輯回歸算法的學習和思考,主要介紹:邏輯回歸的算法介紹、邏輯回歸的數學原理、邏輯回歸的實際應用、邏輯回歸的總結以及網絡安全場景預測,歡迎大家參考討論。
  • [PRML]線性回歸模型--線性基函數模型
    這通常稱為線性回歸(linear regression)。sigmoid函數的線性組合等價於『tanh』函數的線性組合。在監督學習中如回歸和分類,我們不是尋找輸入變量的分布模型。如果數據集足夠大,那麼使用順序算法(sequential algorithms)可能是值得的,也稱為在線算法(on-line algorithms),在這種算法中,每次考慮一個數據點,並在每次這樣的展示後更新模型參數。順序學習也適用於實時應用,在這種應用中,數據觀察是在一個連續的流中到達的,並且必須在看到所有數據點之前做出預測。
  • 線性模型 || 線性回歸(Linear Regression)算法
    目錄:一、線性模型概念二、LR算法直觀原理三、Python代碼實現算法(notice:1)公式中,字母粗體以示向量2)本文中LR指代Linear Regression,而非Logistic Regression)一、線性模型概念
  • python多重線性回歸分析
    python多重線性回歸分析多重線性回歸分析定義多重線性回歸模型:MulitipleLinear Regression多元線性回歸模型:Multivariate Linear Regression數據準備#多重線性回歸#數據準備import pandas as pddf=pd.read_csv('e:/python/out/corr.csv',encoding='utf8')
  • 教程丨機器學習算法:從頭開始構建邏輯回歸模型
    邏輯回歸是繼線性回歸之後最著名的機器學習算法。在很多方面,線性回歸和邏輯回歸是相似的,不過最大的區別在於它們的用途,線性回歸算法用於預測,但邏輯回歸用於分類任務。分類任務很常見,比如把電子郵件分為垃圾郵件和非垃圾郵件、把腫瘤分為惡性或者良性、把網站分為危險站點或正常站點,機器學習算法就可以完成這些任務。
  • 數據科學&機器學習的筆記1:分類、線性回歸和邏輯回歸
    第五章開了個頭,講的是「選擇和評價模型」,大抵是介紹機器學習中的常用模型,分清遇到不同數據分析需求時適用的模型。令我失望的是,真的真的只是講了一下模型的種類,告訴你模型可以用來做什麼,連一點點原理都沒有涉及。我希望今天把課程所學溫習,把上學期的實踐課學到的機器學習原理整合進知識框架裡,順道把之前的筆記好好整理一下。
  • Python機器學習算法入門之梯度下降法實現線性回歸
    背景        文章的背景取自An Introduction to Gradient Descent and Linear Regression,本文想在該文章的基礎上,完整地描述線性回歸算法。部分數據和圖片取自該文章。沒有太多時間摳細節,所以難免有什麼缺漏錯誤之處,望指正。
  • 乾貨 | 對數線性模型之 Logistic 回歸、SoftMax 回歸和最大熵模型
    至於為何選擇Sigmoid函數,後面可以從廣義線性模型導出為什麼是Sigmoid函數。邏輯回歸可以看作是在線性回歸的基礎上構建的分類模型,理解的角度有多種(最好的當然是概率解釋和最小對數損失),而最直接的理解是考慮邏輯回歸是將線性回歸值離散化。
  • 文科生都能看懂的機器學習教程:梯度下降、線性回歸、邏輯回歸
    那些神秘拗口的概念,比如邏輯回歸、梯度下降到底是什麼?j  一個23歲的藥物學專業的學生說,當他去參加機器學習培訓課程的時候,感覺自己就家裡那位不懂現代科技的奶奶。  於是一名叫Audrey Lorberfeld的畢業生,試圖將大眾與機器學習之間的鴻溝,親手填補上。於是有了這個系列文章。  本系列第一講:梯度下降、線性回歸和邏輯回歸。
  • python機器學習預測分析核心算法.pdf
    本書專注於兩類核心的「算法族」,即懲罰線性回歸和集成方法,並通過代碼實例來展示所討論的算法的使用原則。全書共分為7章,詳細討論了預測模型的兩類核心算法、預測模型的構建、懲罰線性回歸和集成方法的具體應用和實現。本書主要針對想提高機器學習技能的Python開發人員,幫助他們解決某一特定的項目或是提升相關的技能。
  • 用Python實現機器學習算法:邏輯回歸
    可以綜合起來為:  其中: 為什麼不用線性回歸的代價函數表示,因為線性回歸的代價函數可能是非凸的,對於分類問題,使用梯度下降很難得到最小值,上面的代價函數是凸函數的圖像如下,即y=1時: 決策邊界和準確度使用scikit-learn庫中的邏輯回歸模型實現
  • Python環境下的8種簡單線性回歸算法
    選自Medium作者:Tirthajyoti Sarkar機器之心編譯參與:晏奇、劉曉坤本文中,作者討論了 8 種在 Python 環境下進行簡單線性回歸計算的算法GitHub 地址:對於大多數數據科學家而言,線性回歸方法是他們進行統計學建模和預測分析任務的起點。但我們不可誇大線性模型(快速且準確地)擬合大型數據集的重要性。如本文所示,在線性回歸模型中,「線性」一詞指的是回歸係數,而不是特徵的 degree。
  • 使用單行代碼評估回歸模型的Python包
    對此的一個內聯嘗試是python包「 regressormetricgraphplot」的開發,該軟體包旨在幫助用戶使用單行代碼繪製評估指標圖,以針對不同的廣泛使用的回歸模型指標進行一目了然的比較。使用該實用程序包,還可以通過將其應用於日常的預測回歸問題,顯著降低從業人員以業餘方式評估不同機器學習算法的障礙。
  • 邏輯回歸(Logistic Regression) 模型簡介
    本文作為美團機器學習InAction系列中的一篇,主要關注邏輯回歸算法的數學模型和參數求解方法,最後也會簡單討論下邏輯回歸和貝葉斯分類的關係,以及在多分類問題上的推廣。要解決這些問題,通常會用到一些已有的分類算法,比如邏輯回歸,或者支持向量機。它們都屬於有監督的學習,因此在使用這些算法之前,必須要先收集一批標註好的數據作為訓練集。有些標註可以從log中拿到(用戶的點擊,購買),有些可以從用戶填寫的信息中獲得(性別),也有一些可能需要人工標註(評論情感極性)。
  • 機器學習算法——線性回歸算法介紹
    1 線性回歸模型簡介線性回歸,就是能夠用一個直線較為精確地描述數據之間的關係。這樣當出現新的數據的時候,就能夠預測出一個簡單的值。線性回歸中最常見的就是房價的問題。一直存在很多房屋面積和房價的數據,如下圖所示:在這種情況下,就可以利用線性回歸構造出一條直線來近似地描述放假與房屋面積之間的關係,從而就可以根據房屋面積推測出房價。2 線性回歸的函數模型通過線性回歸構造出來的函數一般稱之為了線性回歸模型。
  • 線性模型(一)普通線性回歸到廣義線性模型
    普通線性回歸線性回歸線性模型如何解決非線性問題建模方法論背景線性模型為什麼能解決非線性問題。同時提醒讀者避免只從字面理解「線性」帶來誤會,即線性模型只能解決線性問題。本章將線性模型定位和表述為在數學表達式上具有線性的表示方式的數學模型,包含普通線性回歸模型和廣義線性模型(線性支持向量機本章不進行講述)。