學習筆記(三)邏輯迴歸

《機器學習實戰》學習筆記(三)Logistic 迴歸

1. 什麼是邏輯迴歸

線性迴歸和邏輯迴歸其實沒有多大的區別,就是邏輯迴歸多了一個Sigmoid函數,使樣本能映射到[0,1]之間的數值,用來做分類問題。

  1. 線性迴歸:線性指輸入變量是一次的,迴歸即擬合,線性迴歸即:確定唯一的因變量(需要預測的值)和一個或多個數值型的自變量(預測變量)之間的關係。即:求出W,b的值y=f(X)=WX+by=f(X)=WX+b
    其中:W,X均爲向量
  2. 邏輯迴歸:邏輯迴歸即是在線性迴歸函數的輸出結果中加了一個Sigmoid函數,將結果映射到了[0,1]上,從而實現分類。

2. Sigmoid函數

  1. Sigmoid函數:
    Sigmoid(x)=11+ex Sigmoid(x) = \frac{1}{1+e^{-x}}
    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. 總結

  1. 這裏簡單的實現了邏輯迴歸的基本原理,效果不是很好,所得的權重值不穩定,沒有結束條件,完全靠指定的次數結束。難以擬合。
  2. 想要更好的效果可以採用隨機梯度上升算法,或者支持向量機(SVM),支持向量機,它被認爲是目前最好的現成的算法之一。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章