《機器學習實戰》學習筆記(三)Logistic 迴歸
1. 什麼是邏輯迴歸
線性迴歸和邏輯迴歸其實沒有多大的區別,就是邏輯迴歸多了一個Sigmoid函數,使樣本能映射到[0,1]之間的數值,用來做分類問題。
- 線性迴歸:線性指輸入變量是一次的,迴歸即擬合,線性迴歸即:確定唯一的因變量(需要預測的值)和一個或多個數值型的自變量(預測變量)之間的關係。即:求出W,b的值
其中:W,X均爲向量 - 邏輯迴歸:邏輯迴歸即是在線性迴歸函數的輸出結果中加了一個Sigmoid函數,將結果映射到了[0,1]上,從而實現分類。
2. Sigmoid函數
- Sigmoid函數:
3. 代碼實現
樣本數據鏈接:鏈接:https://pan.baidu.com/s/1L-iR8zQR7l3rrNL0WcZSvQ
提取碼:yuma
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 28 15:10:27 2019
@author: xinglin
"""
import matplotlib.pyplot as plt
import numpy as np
class MyLogisticRegression:
def __init__(self):
pass
def sigmoid(self,x):
return 1.0 / (1.0 + np.exp(-x))
# 展示sigmoid
def show_sigmoid(self):
x = np.linspace(-10, 10)
y = self.sigmoid(x)
plt.plot(x,y)
plt.show()
# 加載數據
def loadDataSet(self):
'''
return---np array
trainDataSet:帶常數項的數據
dataSet:原始數據
dataLabel:標籤,類別列表
'''
data = np.loadtxt('Logistic Regression/data1.txt', delimiter=',')
dataSet = data[:,0:2]
#爲了便於進行矩陣運算,每個樣本增加一列 1 ,表示常數項
b = np.ones((dataSet.shape[0],1))
trainDataSet = np.concatenate([dataSet,b],axis = 1)
dataLabel = data[:,2]
return trainDataSet,dataSet,dataLabel
def showData(self):
dataMat,data,labelMat = self.loadDataSet() # 加載數據集
pos = np.where(labelMat == 1)
neg = np.where(labelMat == 0)
plt.scatter(dataMat[pos, 0], dataMat[pos, 1], marker='o', c='b')
plt.scatter(dataMat[neg, 0], dataMat[neg, 1], marker='x', c='r')
plt.show()
def gradAscent(self):
dataMatIn,orgData,classLabels = self.loadDataSet()
dataMatrix = np.mat(dataMatIn) #轉換成numpy的mat
labelMat = np.mat(classLabels).transpose() #轉換成numpy的mat,並進行轉置
m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m爲行數,n爲列數。
alpha = 0.01 #學習速率,控制更新的幅度。
maxCycles = 1000000 #迭代次數
weights = np.ones((n,1))
wList = []
for k in iter(range(maxCycles)):
h = self.sigmoid(dataMatrix * weights) #梯度上升矢量化公式
error = labelMat - h
weights = weights + alpha * dataMatrix.transpose() * error
return weights.getA() #將矩陣轉換爲數組,返回權重數組
def plotBestFit(self,weights):
dataMat,data,labelMat = self.loadDataSet() # 加載數據集
pos = np.where(labelMat == 1)
neg = np.where(labelMat == 0)
plt.scatter(dataMat[pos, 0], dataMat[pos, 1], marker='o', c='b')
plt.scatter(dataMat[neg, 0], dataMat[neg, 1], marker='x', c='r')
x = np.arange(0, 100, 0.1)
y = (-weights[0] * x - weights[2]) / weights[1]
plt.plot(x,y)
plt.show()
if __name__ == '__main__':
Model = MyLogisticRegression()
# Model.show_sigmoid()
weights = Model.gradAscent()
print(weights)
Model.showData()
Model.plotBestFit(weights)
運行效果:
4. 總結
- 這裏簡單的實現了邏輯迴歸的基本原理,效果不是很好,所得的權重值不穩定,沒有結束條件,完全靠指定的次數結束。難以擬合。
- 想要更好的效果可以採用隨機梯度上升算法,或者支持向量機(SVM),支持向量機,它被認爲是目前最好的現成的算法之一。