1.背景知識
在剛剛結束的天貓大數據s1比賽中,邏輯回歸是大家都普遍使用且效果不錯的一種算法。
(1)回歸
先來說說什么是回歸,比如說我們有兩類數據,各有50十個點組成,當我門把這些點畫出來,會有一條線區分這兩組數據,我們擬合出這個曲線(因為很有可能是非線性),就是回歸。我們通過大量的數據找出這條線,並擬合出這條線的表達式,再有數據,我們就以這條線為區分來實現分類。下圖是我畫的一個數據集的兩組數據,中間有一條區分兩組數據的線。

(2)sigmoid函數
我們看到了上圖中兩組數據的划分,那么我們怎么來找出兩組數據的邊界表達式呢,這里用到sigmoid函數。它的形狀大致是(如下),公式


把數據集的特征值設為x1,x2,x3......。我們要求出它們的回歸系數。只要設z=w1*x1+w2*x2.....用sigmoid函數出理是防止數據從0到1發生跳變,因為目標函數是0到1,我們要把帶入x1,x2...多項式數據控制在這之間。
(3)梯度上升算法
梯度上升是指找到函數增長的方向。公式
。在具體實現的過程中,不停地迭代運算直到w的值幾乎不再變化為止。

2.代碼
數據集在工程中有。
導入數據集,並定義sigmoid函數
- def loadDataSet():
- dataMat = []; labelMat = []
- fr = open('/Users/hakuri/Desktop/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))
返回回歸系數,對應於每個特征值,for循環實現了遞歸梯度上升算法。
- def gradAscent(dataMatIn, classLabels):
- dataMatrix = mat(dataMatIn) #convert to NumPy matrix
- labelMat = mat(classLabels).transpose() #convert to NumPy matrix
- m,n = shape(dataMatrix)
- alpha = 0.001
- maxCycles = 500
- weights = ones((n,1))
- for k in range(maxCycles): #heavy on matrix operations
- h = sigmoid(dataMatrix*weights) #matrix mult
- error = (labelMat - h) #vector subtraction
- weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
- return weights
結果,返回了特征值的回歸系數。我們的數據集有兩個特征值分別是x1,x2。我們又增設了了x0變量。得到的結果
[[ 4.12414349]
[ 0.48007329]
[-0.6168482 ]]
我們得出x1和x2的關系(設x0=1),0=4.12414349+0.48007329*x1-0.6168482*x2
畫出x1與x2的關系圖
