天天看點

資料挖掘算法(三)--logistic回歸

資料挖掘算法學習筆記彙總

資料挖掘算法(一)–K近鄰算法 (KNN)

資料挖掘算法(二)–決策樹

資料挖掘算法(三)–logistic回歸

在介紹logistic回歸之前先複習幾個基礎知識點,有助于後面的了解。

基本數學知識點

1、對數似然函數

若總體X為離散型,其機率分布列為

P(X=x)=p(x,θ)

其中 θ 為未知參數。設 (X1,X2,...,Xn) 是取自總體樣本容量為n的樣本,則 (X1,X2,...,Xn) 的聯合機率分布率為 ∏i=1np(xi,θ)

又設 (X1,X2,...,Xn) 的一組觀測值為 (x1,x2,...,xn) ,易知樣本 X1,X2,...,Xn 取到觀測值 x1,x2,...,xn 的機率為 L(θ)=L(x1,x2,...,xn;θ)=∏i=1np(xi,θ)

這一機率随 θ 的取值而變化,它是 θ 的函數,稱 L(θ) 為樣本的似然函數。但是由于來連乘的函數處理起來比較麻煩,是以對 L(θ) 取自然對數變成加法來處理要簡單點。

lnL(θ)=∑i=1nlnp(xi,θ)

2、logistic函數

logistic函數或logistic曲線是常見的“S”形(sigmoid curve ,S形曲線),方程式如下:

f(x)=L1+e−k(x−x0)

其中

  • e 自然對數
  • x0 S形中點的x值
  • L 曲線的 最大值
  • k曲線的陡度
    資料挖掘算法(三)--logistic回歸

    上圖是 L=1,k=1,x0=0 時的圖像

    這裡主要說明下這個函數的導數的性質,後面推導的時候會用到。

    f(x)=11+e−x=ex1+ex

    ddxf(x)=ex(1+ex)−exex(1+ex)2

    ddxf(x)=ex(1+ex)2=f(x)(1−f(x))

logistic回歸數學推導

先看一個簡單的例子:

資料挖掘算法(三)--logistic回歸

我們将平面上的點分為兩類,中間的紅色線條為邊界。

預測類别 y=1 如果 −3+x1+x2≥0 預測類别 y=0 如果 −3+x1+x2<0

此例子中

hθ(x)=g(θ0+θ1x1+θ2x2)

對更多元的資料進行分類時,線性邊界的情況,邊界形式如下:

θ1x1+θ2x2+...+θnxn=θTx

根據logistic回歸可知預測函數為:

hθ(x(i))=g(θTxi)=11+e−θTxi

hθ(x(i) 函數的值有特殊的含義,它表示結果取1的機率,是以對于輸入x分類結果為類别1和類别0的機率分别為:

P(y=1|x;θ)=hθ(x(i)

P(y=0|x;θ)=1−hθ(x(i)

合起來寫則可以得到下式:

P(y|x;θ)=(hθ(x))y(1−hθ(x))1−y

取似然函數得到下式:

L(θ)=∏i=1mP(y(i)|x(i),θ)

求自然對數得到對數似然函數:

l(θ)=lnL(θ)

=∑i=1m(y(i)lnhθ(x(i))+(1−y(i))ln(1−hθ(x(i))))

最大似然估計就是要求得使 l(θ) 取最大值時的 θ ,利用梯度上升法求解,求得的 θ 就是要求的最佳參數。下面是利用梯度上升法求解過程。

求利用梯度上升法求解 l(θ) 的最大值時,根據梯度上升法知道 θ 的更新公式如下:

θj:=θj+α∂∂θjl(θ)    (j=0...n)

下面先求出 l(θ) 的偏導數:

∂∂θjl(θ)=∑i=1m((y(i)1hθ(x(i))∂∂θjhθ(x(i))−(1−y(i))11−hθ(x(i))∂∂θjhθ(x(i))

=∑i=1m((y(i)1g(θTx(i))−(1−y(i))11−g(θTx(i)))∂∂θjg(θTx(i))

因為 g(θTxi) 是logistic函數

g(θTxi)=11+e−θTxi

是以我們利用前面講的logistic函數的導數性質可以将 l(θ) 的偏導數轉化

∂∂θjl(θ)=∑i=1m((y(i)1g(θTx(i))−(1−y(i))11−g(θTx(i)))g(θTx(i))(1−g(θTx(i)))∂∂θjθTx(i)

=∑i=1m(y(i)(1−g(θTx(i)))−(1−y(i))g(θTx(i)))x(i)j

=∑i=1m(y(i)−g(θTx(i)))x(i)j

=∑i=1m(y(i)−hθ(x(i)))x(i)j

這樣就得到了更新的過程

θj:=θj+α∑i=1m(y(i)−hθ(x(i)))x(i)j    (j=0...n)

python代碼實作

本文代碼運作環境:

python:3.5.1

pandas:0.19.2

其他環境可能有細微差别

# -*coding:utf-8*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import math

# 擷取資料
data = pd.read_table("./logistic.txt", sep="\t", header=None)
dataMat = data.iloc[:, :-]
labelMat = data.iloc[:, -]


def sigmoid(dataSeries):
    return  / ( + np.exp(-dataSeries))

# 梯度上升算法
def gradAscent(dataMatrix, LabelsVector):
    n = dataMatrix.shape[]
    alpha = 
    maxCycles = 
    thetas = np.ones((n, ))
    for k in range(maxCycles):  # heavy on matrix operations
        h = sigmoid(dataMatrix * thetas)  # matrix mult
        error = LabelsVector.T - h  # vector subtraction
        thetas = thetas + alpha * dataMatrix.T * error  # matrix mult
    return thetas


def plotBestFit(thetas, data):
    """    
    :param thetas: type DataFrame , the thetas 
    :param data: type DtaFrame , all the data
    :return: 
    """
    X1 = data[data[] == ]
    X2 = data[data[] == ]
    fig = plt.figure()
    ax = fig.add_subplot()
    ax.scatter(X1[], X1[], s=, c='red', marker='s')
    ax.scatter(X2[], X2[], s=, c='green')
    x = np.arange(-, , )
    y = (-thetas.iloc[, ] - thetas.iloc[, ] * x) / thetas.iloc[, ]
    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()

thetas = gradAscent(np.mat(dataMat), np.mat(labelMat))
plotBestFit(pd.DataFrame(thetas), data)
           

畫出的圖如下所示:

資料挖掘算法(三)--logistic回歸

代碼和資料下載下傳位址:連結:http://pan.baidu.com/s/1hs6CKL2 密碼:308l

參考資料

1、https://en.wikipedia.org/wiki/Maximum_likelihood_estimation

2、https://en.wikipedia.org/wiki/Logistic_function

歡迎python愛好者加入:學習交流群 667279387

繼續閱讀