Python机器学习算法 — 逻辑回归(Logistic Regression)
邏輯回歸--簡介
????????邏輯回歸(Logistic Regression)就是這樣的一個過程:面對一個回歸或者分類問題,建立代價函數(shù),然后通過優(yōu)化方法迭代求解出最優(yōu)的模型參數(shù),然后測試驗證我們這個求解的模型的好壞。
? ? ? ? Logistic回歸雖然名字里帶“回歸”,但是它實際上是一種分類方法,主要用于兩分類問題(即輸出只有兩種,分別代表兩個類別)。
? ? ? ? 回歸模型中,y是一個定性變量,比如y=0或1,logistic方法主要應(yīng)用于研究某些事件發(fā)生的概率。
邏輯回歸--優(yōu)缺點
?優(yōu)點:?
????? ? ?1、速度快,適合二分類問題?;
????? ? ?2、簡單易于理解,直接看到各個特征的權(quán)重?;
????? ? ?3、能容易地更新模型吸收新的數(shù)據(jù)?;
?缺點:
????? ? ?1、對數(shù)據(jù)的場景的適應(yīng)能力有局限性,不如決策樹算法適應(yīng)性強(qiáng);
?
邏輯回歸--用途
用途:
????????1、尋找危險因素:尋找某一疾病的危險因素等;
????????2、預(yù)測:根據(jù)模型,預(yù)測在不同的自變量情況下,發(fā)生某病或某種情況的概率有多大;
????? ? 3、判別:實際上跟預(yù)測有些類似,也是根據(jù)模型,判斷某人屬于某病或?qū)儆谀撤N情況的概率有多大,也就是看一下這個人有多大的可能性是屬于某病
邏輯回歸--原理
Logistic Regression和Linear Regression的原理是相似的,按照我自己的理解,可以簡單的描述為這樣的過程:
? ? ? (1)找一個合適的預(yù)測函數(shù)(Andrew Ng的公開課中稱為hypothesis),一般表示為h函數(shù),該函數(shù)就是我們需要找的分類函數(shù),它用來預(yù)測輸入數(shù)據(jù)的判斷結(jié)果。這個過程時非常關(guān)鍵的,需要對數(shù)據(jù)有一定的了解或分析,知道或者猜測預(yù)測函數(shù)的“大概”形式,比如是線性函數(shù)還是非線性函數(shù)。
? ? ? (2)構(gòu)造一個Cost函數(shù)(損失函數(shù)),該函數(shù)表示預(yù)測的輸出(h)與訓(xùn)練數(shù)據(jù)類別(y)之間的偏差,可以是二者之間的差(h-y)或者是其他的形式。綜合考慮所有訓(xùn)練數(shù)據(jù)的“損失”,將Cost求和或者求平均,記為J(θ)函數(shù),表示所有訓(xùn)練數(shù)據(jù)預(yù)測值與實際類別的偏差。
? ? ? (3)顯然,J(θ)函數(shù)的值越小表示預(yù)測函數(shù)越準(zhǔn)確(即h函數(shù)越準(zhǔn)確),所以這一步需要做的是找到J(θ)函數(shù)的最小值。找函數(shù)的最小值有不同的方法,Logistic Regression實現(xiàn)時有的是梯度下降法(Gradient Descent)。
?
?
邏輯回歸--具體過程
一、構(gòu)造預(yù)測函數(shù)
????????Logistic回歸雖然名字里帶“回歸”,但是它實際上是一種分類方法,主要用于兩分類問題(即輸出只有兩種,分別代表兩個類別),所以利用了Logistic函數(shù)(或稱為Sigmoid函數(shù)),函數(shù)形式為:
????????Sigmoid 函數(shù)在有個很漂亮的“S”形,如下圖所示:
? ? ? ?下面左圖是一個線性的決策邊界,右圖是非線性的決策邊界:
? ? ? 對于線性邊界的情況,邊界形式如下:
? ? ? 構(gòu)造預(yù)測函數(shù)為:
? ? ? ? 函數(shù)的值有特殊的含義,它表示結(jié)果取1的概率,因此對于輸入x分類結(jié)果為類別1和類別0的概率分別為:
?
?
二、構(gòu)造損失函數(shù)
? ? ? ??Cost 函數(shù)和 J 函數(shù)如下,它們是基于最大似然估計推導(dǎo)得到的:
?
????下面詳細(xì)說明推導(dǎo)的過程:
????????(1)式綜合起來可以寫成:
????? ? 取似然函數(shù)為:
????? ? 對數(shù)似然函數(shù)為:
????????最大似然估計就是求使轉(zhuǎn)存失敗重新上傳取消取最大值時的θ,其實這里可以使用梯度上升法求解,求得的θ就是要求的最佳參數(shù)。但是,在Andrew Ng的課程中將?J(θ)??取為下式,即:
????????因為乘了一個負(fù)的系數(shù)-1/m,所以取?J(θ)?最小值時的θ為要求的最佳參數(shù)。
?
?
三、梯度下降法求的最小值
????????求J(θ)的最小值可以使用梯度下降法,根據(jù)梯度下降法可得θ的更新過程:
????????式中為α學(xué)習(xí)步長,下面來求偏導(dǎo):
????????θ更新過程可以寫成:
?
邏輯回歸--實例
?
# -*- coding: utf-8 -*-from numpy import * import matplotlib.pyplot as plt#從文件中加載數(shù)據(jù):特征X,標(biāo)簽label def loadDataSet():dataMatrix=[]dataLabel=[]#這里給出了python 中讀取文件的簡便方式f=open('testSet.txt')for line in f.readlines():#print(line)lineList=line.strip().split()dataMatrix.append([1,float(lineList[0]),float(lineList[1])])dataLabel.append(int(lineList[2]))#for i in range(len(dataMatrix)):# print(dataMatrix[i])#print(dataLabel)#print(mat(dataLabel).transpose())matLabel=mat(dataLabel).transpose()return dataMatrix,matLabel#logistic回歸使用了sigmoid函數(shù) def sigmoid(inX):return 1/(1+exp(-inX))#函數(shù)中涉及如何將list轉(zhuǎn)化成矩陣的操作:mat() #同時還含有矩陣的轉(zhuǎn)置操作:transpose() #還有l(wèi)ist和array的shape函數(shù) #在處理矩陣乘法時,要注意的便是維數(shù)是否對應(yīng)#graAscent函數(shù)實現(xiàn)了梯度上升法,隱含了復(fù)雜的數(shù)學(xué)推理 #梯度上升算法,每次參數(shù)迭代時都需要遍歷整個數(shù)據(jù)集 def graAscent(dataMatrix,matLabel):m,n=shape(dataMatrix)matMatrix=mat(dataMatrix)w=ones((n,1))alpha=0.001num=500for i in range(num):error=sigmoid(matMatrix*w)-matLabelw=w-alpha*matMatrix.transpose()*errorreturn w#隨機(jī)梯度上升算法的實現(xiàn),對于數(shù)據(jù)量較多的情況下計算量小,但分類效果差 #每次參數(shù)迭代時通過一個數(shù)據(jù)進(jìn)行運算 def stocGraAscent(dataMatrix,matLabel):m,n=shape(dataMatrix)matMatrix=mat(dataMatrix)w=ones((n,1))alpha=0.001num=20 #這里的這個迭代次數(shù)對于分類效果影響很大,很小時分類效果很差 for i in range(num):for j in range(m):error=sigmoid(matMatrix[j]*w)-matLabel[j]w=w-alpha*matMatrix[j].transpose()*error return w#改進(jìn)后的隨機(jī)梯度上升算法 #從兩個方面對隨機(jī)梯度上升算法進(jìn)行了改進(jìn),正確率確實提高了很多 #改進(jìn)一:對于學(xué)習(xí)率alpha采用非線性下降的方式使得每次都不一樣 #改進(jìn)二:每次使用一個數(shù)據(jù),但是每次隨機(jī)的選取數(shù)據(jù),選過的不在進(jìn)行選擇 def stocGraAscent1(dataMatrix,matLabel):m,n=shape(dataMatrix)matMatrix=mat(dataMatrix)w=ones((n,1))num=200 #這里的這個迭代次數(shù)對于分類效果影響很大,很小時分類效果很差setIndex=set([])for i in range(num):for j in range(m):alpha=4/(1+i+j)+0.01dataIndex=random.randint(0,100)while dataIndex in setIndex:setIndex.add(dataIndex)dataIndex=random.randint(0,100)error=sigmoid(matMatrix[dataIndex]*w)-matLabel[dataIndex]w=w-alpha*matMatrix[dataIndex].transpose()*error return w#繪制圖像 def draw(weight):x0List=[];y0List=[];x1List=[];y1List=[];f=open('testSet.txt','r')for line in f.readlines():lineList=line.strip().split()if lineList[2]=='0':x0List.append(float(lineList[0]))y0List.append(float(lineList[1]))else:x1List.append(float(lineList[0]))y1List.append(float(lineList[1]))fig=plt.figure()ax=fig.add_subplot(111)ax.scatter(x0List,y0List,s=10,c='red')ax.scatter(x1List,y1List,s=10,c='green')xList=[];yList=[]x=arange(-3,3,0.1)for i in arange(len(x)):xList.append(x[i])y=(-weight[0]-weight[1]*x)/weight[2]for j in arange(y.shape[1]):yList.append(y[0,j])ax.plot(xList,yList)plt.xlabel('x1');plt.ylabel('x2')plt.show()if __name__ == '__main__':dataMatrix,matLabel=loadDataSet()#weight=graAscent(dataMatrix,matLabel)weight=stocGraAscent1(dataMatrix,matLabel)print(weight)draw(weight)?
?
?
作者:ls秦
出處:http://www.cnblogs.com/lsqin/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利.
來源:https://www.cnblogs.com/lsqin/p/9342935.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Python机器学习算法 — 逻辑回归(Logistic Regression)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鹰牌瓷砖怎么样,产品如何?
- 下一篇: python机器学习库xgboost——