1. 程式人生 > >機器學習與資料探勘-logistic迴歸及手寫識別例項的實現

機器學習與資料探勘-logistic迴歸及手寫識別例項的實現

本文主要介紹logistic迴歸相關知識點和一個手寫識別的例子實現

一、logistic迴歸介紹:

logistic迴歸演算法很簡單,這裡簡單介紹一下:

1、和線性迴歸做一個簡單的對比

下圖就是一個簡單的線性迴歸例項,簡單一點就是一個線性方程表示


(就是用來描述自變數和因變數已經偏差的方程)


2、logistic迴歸

可以看到下圖,很難找到一條線性方程能將他們很好的分開。這裡也需要用到logistic迴歸來處理了。



logistic迴歸本質上是線性迴歸,只是在特徵到結果的對映中加入了一層函式對映,即先把特徵線性求和,然後使用函式g(z)將最為假設函式來預測。g(z)可以將連續值對映到0和1上。
logistic迴歸的假設函式如下,線性迴歸假設函式只是

clip_image025



logistic迴歸用來分類0/1問題,也就是預測結果屬於0或者1的二值分類問題。這裡假設了二值滿足伯努利分佈,也就是



其實這裡求的是最大似然估計,然後求導,最後得到迭代公式結果為

clip_image007


可以看到與線性迴歸類似。

3、logistic迴歸原理介紹

(1)找一個合適的預測函式,一般表示為h函式,該函式就是我們需要找的分類函式,它用來預測輸入資料的判斷結果。


(2)構造一個Cost函式(損失函式),該函式表示預測的輸出(h)與訓練資料類別(y)之間的偏差,可以是二者之間的差(h-y)或者是其他的形式。綜合考慮所有訓練資料的“損失”,將Cost求和或者求平均,記為J(θ)函式,表示所有訓練資料預測值與實際類別的偏差。



實際上這裡的Cost函式和J(θ)函式是基於最大似然估計推導得到的,這裡也就不詳細講解了。

(3)我們可以看出J(θ)函式的值越小表示預測函式越準確(即h函式越準確),所以這一步需要做的是找到J(θ)函式的最小值,Logistic Regression實現時有的是梯度下降法(Gradient Descent)。

clip_image007

梯度下降法是按下面的流程進行的:
1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。
2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。
梯度方向由J(θ)對θ的偏導數確定,由於求的是極小值,因此梯度方向是偏導數的反方向。結果為

clip_image007
迭代更新的方式有兩種,一種是批梯度下降,也就是對全部的訓練資料求得誤差後再對θ進行更新,另外一種是增量梯度下降,每掃描一步都要對θ進行更新。前一種方法能夠不斷收斂,後一種方法結果可能不斷在收斂處徘徊。

二、手寫識別的例子實現

1、簡介 手寫識別的概念:是指將在手寫裝置上書寫時產生的軌跡資訊轉化為具體字碼。 手寫識別系統是個很大的專案,識別漢字、英語、數字、其他字元。本文重點不在手寫識別而在於理解logistic,因此只識別0~9單個數字。

講到用logistic演算法識別數字0~9,這是個十類別問題,如果要用logistic迴歸,得做10次logistic迴歸,第一次將0作為一個類別,1~9作為另外一個類別,這樣就可以識別出0或非0。同樣地可以將1作為一個類別,0、2~9作為一個類別,這樣就可以識別出1或非1........

本文的例項為了簡化,我只選出0和1的樣本,這是個二分類問題。

輸入格式:每個手寫數字已經事先處理成32*32的二進位制文字,儲存為txt檔案。

工程檔案目錄說明:



logistic regression.py實現的功能:從train裡面讀取訓練資料,然後用梯度上升演算法訓練出引數Θ,接著用引數Θ來預test裡面的測試樣本,同時計算錯誤率。

開啟test或者train一個檔案看看:



2、簡單實現:

(1)將每個圖片(即txt文字)轉化為一個向量,即32*32的陣列轉化為1*1024的陣列,這個1*1024的陣列用機器學習的術語來說就是特徵向量。

(2)訓練樣本中有m個圖片,可以合併成一個m*1024的矩陣,每一行對應一個圖片。

(3)用梯度下降法計算得到迴歸係數。

(4)分類,根據引數weigh對測試樣本進行預測,同時計算錯誤率。

程式碼如下:

# -*- coding: utf-8 -*-
from numpy import *
from os import listdir

"""
(1)將每個圖片(即txt文字)轉化為一個向量,即32*32的陣列轉化為1*1024的陣列,這個1*1024的陣列用機器學習的術語來說就是特徵向量。
實現的功能是從資料夾中讀取所有檔案,並將其轉化為矩陣返回
如呼叫loadData('train'),則函式會讀取所有的txt檔案('0_0.txt'一直到'1_150.txt')
並將每個txt檔案裡的32*32個數字轉化為1*1024的矩陣,最終返回大小是m*1024的矩陣
同時返回每個txt檔案對應的數字,0或1
"""
def loadData(direction):
    print(direction)
    trainfileList=listdir(direction)
    m=len(trainfileList)
    dataArray= zeros((m,1024))
    labelArray= zeros((m,1))
    for i in range(m):
        returnArray=zeros((1,1024))  #每個txt檔案形成的特徵向量
        filename=trainfileList[i]
        fr=open('%s/%s' %(direction,filename))
        for j in range(32):
            lineStr=fr.readline()
            for k in range(32):
                returnArray[0,32*j+k]=int(lineStr[k])
        dataArray[i,:]=returnArray   #儲存特徵向量
    
        filename0=filename.split('.')[0]
        label=filename0.split('_')[0]
        labelArray[i]=int(label)     #儲存類別
    return dataArray,labelArray

#sigmoid(inX)函式
def sigmoid(inX):
    return 1.0/(1+exp(-inX))

#用梯度下降法計算得到迴歸係數,alpha是步長,maxCycles是迭代步數。
def gradAscent(dataArray,labelArray,alpha,maxCycles):
    dataMat=mat(dataArray)    #size:m*n
    labelMat=mat(labelArray)      #size:m*1
    m,n=shape(dataMat)
    weigh=ones((n,1)) 
    for i in range(maxCycles):
        h=sigmoid(dataMat*weigh)
        error=labelMat-h    #size:m*1
        weigh=weigh+alpha*dataMat.transpose()*error
    return weigh

#分類函式,根據引數weigh對測試樣本進行預測,同時計算錯誤率
def classfy(testdir,weigh):
    dataArray,labelArray=loadData(testdir)
    dataMat=mat(dataArray)
    labelMat=mat(labelArray)
    h=sigmoid(dataMat*weigh)  #size:m*1
    m=len(h)
    error=0.0
    for i in range(m):
        if int(h[i])>0.5:
            print (int(labelMat[i]),'is classfied as: 1')
            if int(labelMat[i])!=1:
                error+=1
                print ('error')
        else:
            print (int(labelMat[i]),'is classfied as: 0')
            if int(labelMat[i])!=0:
                error+=1
                print ('error')
    print ('error rate is:','%.4f' %(error/m))
"""
用loadData函式從train裡面讀取訓練資料,接著根據這些資料,用gradAscent函式得出引數weigh,最後就可以用擬
合引數weigh來分類了。
"""                
def digitRecognition(trainDir,testDir,alpha=0.07,maxCycles=10):
    data,label=loadData(trainDir)
    weigh=gradAscent(data,label,alpha,maxCycles)
    classfy(testDir,weigh)

#執行函式    
digitRecognition('train','test',0.01,50)       
        
        
當然,digitRecognition('train','test',0.01,50)  這裡面的0.01 和 50都是可以調整的
最終結果如下:



整個工程檔案包括原始碼、訓練集、測試集,可到點選下載

參考資料:

相關推薦

機器學習資料-logistic迴歸識別例項實現

本文主要介紹logistic迴歸相關知識點和一個手寫識別的例子實現 一、logistic迴歸介紹: logistic迴歸演算法很簡單,這裡簡單介紹一下: 1、和線性迴歸做一個簡單的對比 下圖就是一個簡單的線性迴歸例項,簡單一點就是一個線性方程表示 (就是用來描述自變數和因

【Mark Schmidt課件】機器學習資料——非線性迴歸

本課件主要內容包括: 魯棒迴歸 體育運動中的非線性級數 自適應計數/距離法 線性模型的侷限性 非線性特徵變換 一般多項式特徵(d = 1) 英文原文課件下載地址: http://page5.dfpan

【Mark Schmidt課件】機器學習資料——特徵選擇

本課件的主要內容如下: 上次課程回顧:尋找“真實”模型 資訊準則 貝葉斯資訊準則 關於食物過敏 特徵選擇 全基因組關聯分析 “迴歸權重”方法 搜尋評分法 評分函式的選擇 “特徵數量”懲罰

【Mark Schmidt課件】機器學習資料——數值優化梯度下降

本課件主要包括以下內容: 優化簡介 上次課程回顧:線性迴歸 大規模最小二乘 尋找區域性最小值的梯度下降法 二維梯度下降 存在奇異點的最小二乘 魯棒迴歸 基於L1-範數的迴歸 L1-範數的平滑近似

【Mark Schmidt課件】機器學習資料——正規方程組

本課件的主要內容包括: d維資料的梯度和臨界點 最小二乘偏導數 矩陣代數回顧 線性最小二乘 線性和二次梯度 正規方程組 最小二乘問題的不正確解 最小二乘解的非唯一性 凸函式 如何判斷函式的

【Mark Schmidt課件】機器學習資料——普通最小二乘

本課件主要內容包括: 有監督學習:迴歸 示例:依賴與解釋變數 數字標籤的處理 一維線性迴歸 最小二乘目標 微分函式最小化 最小二乘解 二維最小二乘 d維最小二乘 偏微分

【Mark Schmidt課件】機器學習資料——進一步討論線性分類器

本課件主要內容包括: 上次課程回顧:基於迴歸的分類方法 Hinge損失 Logistic損失 Logistic迴歸與SVMs “黑盒”分類器比較 最大餘量分類器 支援向量機 魯棒性與凸近似 非凸0-

【Mark Schmidt課件】機器學習資料——線性分類器

本課件主要內容包括: 上次課程回顧:L1正則化 組合特徵選擇 線性模型與最小二乘 梯度下降與誤差函式 正則化 辨識重要郵件 基於迴歸的二元分類? 一維判決邊界 二維判決邊界 感知器演算法

【Mark Schmidt課件】機器學習資料——多元分類

本課件主要內容: 上次課程回顧:隨機梯度 無限資料的隨機梯度 詞性標註POS POS特徵 多元線性分類 題外話:多標籤分類 多元SVMs 多元Logistic迴歸 題外話:Frobenius範數

【Mark Schmidt課件】機器學習資料——MLEMAP

本課件的主要內容包括: 上次課程回顧:多元線性分類器 決策邊界形狀 識別重要電子郵件 Sigmoid函式 最大似然估計MLE 最小化負對數似然NLL 樸素貝葉斯的MLE 有監督學習的MLE Logi

【Mark Schmidt課件】機器學習資料——主元分析PCA

本課件主要內容包括: 上次課程回顧:MAP估計 人類 vs. 機器感知 隱因子模型 向量量化 向量量化 vs. PCA 主元分析PCA的應用 PCA目標函式 英文原文課件下載地址: h

【Mark Schmidt課件】機器學習資料——進一步討論PCA

本課件的主要內容包括: 機器學習工程師需要精通的10種演算法 上次課程回顧:隱因子模型 上次課程回顧:主元分析 上次課程回顧:PCA幾何描述 題外話:資料凝聚 PCA計算:交替最小化 PCA計算:預測 PCA

【Mark Schmidt課件】機器學習資料——稀疏矩陣分解

本課件主要內容包括: 上次課程回顧:基於正交/序貫基的PCA 人眼的顏色對立 顏色對立表示法 應用:人臉檢測 特徵臉 VQ vs. PCA vs. NMF 面部表示 非負最小二乘法 稀疏性與非負最小

【Mark Schmidt課件】機器學習資料——推薦系統

本課件主要內容: 上次課程回顧:隱因子模型 魯棒PCA 隱因子模型的變化形式 Netflix獎 協同過濾問題 協同過濾的矩陣分解 基於內容的濾波 vs. 協同濾波 混合方法 SVD特徵的隨機梯度

資料預處理程式碼分享——機器學習資料

資料預處理分為6步: 第1步:匯入NumPy和Pandas庫。NumPy和Pandas是每次都要匯入的庫,其中Numpy包含了數學計算函式,Pnadas是一個用於匯入和管理資料集(Data Sets)的類庫。 第2步:匯入資料集。資料集一般都是.csv格式,csv

【Mark Schmidt課件】機器學習資料——深度學習

本課件的主要內容為: 有監督訓練路線圖 關於神經網路 線性-線性模型 非線性簡介 為什麼使用Sigmoid函式? 為什麼使用神經網路? 大腦中的深層結構 深度學習 ML與深度學習的歷史 ImageNet挑戰 人工神經網

【龍心塵】專注機器學習資料

龍心塵 『五道口計算機學院』畢業,有幾年機器學習/資料探勘工作經驗。某廠打雜,做過使用者畫像、智慧營銷策略、網路安全機器學習、NLP等專案。歡迎聯絡和交流。 EMAIL: [email protected]  QQ: 3253950332 資料科學沙龍群: 169492443(不

機器學習】加州理工學院公開課——機器學習資料 1.學習問題

一、概念形式化 輸入:x 輸出:y 目標函式:F:x → y 資料:(x1, y1), (x2, y2), …, (xN, yN) 假設函式:g:x → y 假設集:H={h},   G∈H (假設集有助於理解是否用這個演算法及用這個演

加州理工學院公開課:機器學習資料_誤差和噪聲(第四課)

這一課的主題是:誤差分析與噪聲處理。 該課時的主要內容如下: 1、Nonlinear Transformation(Continue)(非線性轉換(續)) 2、Error Measure (誤差度量)(重點) 3、Noisy Targets(噪聲指標)(重點) 4、Prea

機器學習資料-K最近鄰(KNN)演算法的實現(java和python版)

KNN演算法基礎思想前面文章可以參考,這裡主要講解java和python的兩種簡單實現,也主要是理解簡單的思想。 python版本: 這裡實現一個手寫識別演算法,這裡只簡單識別0~9熟悉,在上篇文章中也展示了手寫識別的應用,可以參考:機器學習與資料探勘-logistic迴