資料挖掘算法學習筆記彙總
資料挖掘算法(一)–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回歸數學推導
先看一個簡單的例子:
我們将平面上的點分為兩類,中間的紅色線條為邊界。
預測類别 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)
畫出的圖如下所示:
代碼和資料下載下傳位址:連結: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