機器學習與資料探勘-logistic迴歸及手寫識別例項的實現
本文主要介紹logistic迴歸相關知識點和一個手寫識別的例子實現
一、logistic迴歸介紹:
logistic迴歸演算法很簡單,這裡簡單介紹一下:
1、和線性迴歸做一個簡單的對比
下圖就是一個簡單的線性迴歸例項,簡單一點就是一個線性方程表示
(就是用來描述自變數和因變數已經偏差的方程)
2、logistic迴歸
可以看到下圖,很難找到一條線性方程能將他們很好的分開。這裡也需要用到logistic迴歸來處理了。
logistic迴歸本質上是線性迴歸,只是在特徵到結果的對映中加入了一層函式對映,即先把特徵線性求和,然後使用函式g(z)將最為假設函式來預測。g(z)可以將連續值對映到0和1上。
logistic迴歸的假設函式如下,線性迴歸假設函式只是
logistic迴歸用來分類0/1問題,也就是預測結果屬於0或者1的二值分類問題。這裡假設了二值滿足伯努利分佈,也就是
其實這裡求的是最大似然估計,然後求導,最後得到迭代公式結果為
可以看到與線性迴歸類似。
3、logistic迴歸原理介紹
(1)找一個合適的預測函式,一般表示為h函式,該函式就是我們需要找的分類函式,它用來預測輸入資料的判斷結果。
(2)構造一個Cost函式(損失函式),該函式表示預測的輸出(h)與訓練資料類別(y)之間的偏差,可以是二者之間的差(h-y)或者是其他的形式。綜合考慮所有訓練資料的“損失”,將Cost求和或者求平均,記為J(θ)函式,表示所有訓練資料預測值與實際類別的偏差。
實際上這裡的Cost函式和J(θ)函式是基於最大似然估計推導得到的,這裡也就不詳細講解了。
(3)我們可以看出J(θ)函式的值越小表示預測函式越準確(即h函式越準確),所以這一步需要做的是找到J(θ)函式的最小值,Logistic Regression實現時有的是梯度下降法(Gradient Descent)。
梯度下降法是按下面的流程進行的:
1)首先對θ賦值,這個值可以是隨機的,也可以讓θ是一個全零的向量。
2)改變θ的值,使得J(θ)按梯度下降的方向進行減少。
梯度方向由J(θ)對θ的偏導數確定,由於求的是極小值,因此梯度方向是偏導數的反方向。結果為
迭代更新的方式有兩種,一種是批梯度下降,也就是對全部的訓練資料求得誤差後再對θ進行更新,另外一種是增量梯度下降,每掃描一步都要對θ進行更新。前一種方法能夠不斷收斂,後一種方法結果可能不斷在收斂處徘徊。
二、手寫識別的例子實現
講到用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課件】機器學習與資料探勘——MLE與MAP
本課件的主要內容包括: 上次課程回顧:多元線性分類器 決策邊界形狀 識別重要電子郵件 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迴