1. 程式人生 > >Logistic迴歸演算法(梯度上升)

Logistic迴歸演算法(梯度上升)

Logistic迴歸演算法是一個最優化演算法,迴歸就是擬合的過程。Logistic迴歸的思想就是利用現有資料對分類邊界建立線性迴歸公式,今天我們用這個演算法來解決二值分類問題。

這裡介紹一個名叫Sigmoid的公式,這個函式是一種階躍函式,(詳細含義可以去問度娘)利用這個函式我們可以預測二值分類問題,為了使用Logistic迴歸分類器,我們需要在每一個特徵值上乘以一個迴歸係數,然後把所有的值加起來,代入到Sigmoid函式中當它的值大於0.5的資料被分到1類,小於0.5的被分到0類。這裡最佳迴歸係數可以有多種方法確定,這裡先介紹一種利用梯度上升優化演算法求解迴歸係數。testSet.txt下載(提取碼:0dc4)

from numpy import *

def loadDataSet():
    dataMat = []; labelMat = []
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat

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

def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)            
    labelMat = mat(classLabels).transpose() 
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):              
        h = sigmoid(dataMatrix*weights)     
        error = (labelMat - h)              
        weights = weights + alpha * dataMatrix.transpose()* error 
    return weights
第一個函式還是初始化資料,dataMat是屬性資料集,在dataMat的第一列都設定為1主要是為了方便計算。labelMat儲存的是標籤資料。第二個函式即是Sigmoid函式公式。第三個函式是最主要的函式,用於計算最佳迴歸係數。首先將儲存特徵值的列表轉換成矩陣形式。以便進行計算,將標籤資料轉換成列向量。alpha是向目標移動的步長,maxCycles是迭代次數,我們可以改變這兩個值來確定最佳的迴歸係數。for迴圈裡的前兩句是計算真是類別與預測類別的差值,接下來按照差值的方向調整迴歸係數。