1. 程式人生 > >機器學習之監督標題學習__線性分類

機器學習之監督標題學習__線性分類

機器學習之監督標題學習__線性分類
一,logistic迴歸 (邏輯迴歸):
通過不斷修正縮小誤差最終得到準確的模型,整個過程中需要不斷迴歸,直到達到指定的次數或者達到設定的精度
二,sigsigmoid函式:

啟用函式sigmoid函式是一種階躍函式,輸出範圍在[0,1],在迴歸問題中,我們需要找到最佳的迴歸係數,需要用到最優化演算法。

Sigmoid函式: f(x)=1/(1+exp^(-x)) (exp,高等數學裡以自然常數e為底的指數函式)在這裡插入圖片描述通過此函式將任何數字投射為0到1之間的數,有利於進行判定

三,精度:alpha(模型允許的誤差值,一般來說誤差越小運算量越大),同時如果過分追求高精度,容易造成模型過度複雜,從而造成過擬合的情況(即在訓練集中的預測非常精確,但是在測試集中的準確率非常低)

四,步長(也稱學習率)
即每次修正的大小,如果步長變大,則每次向正確引數移動的距離變大,學習效率變高,但是容易造成引數越過正確值

五,梯度
梯度上升和梯度下降:梯度是三維以上的空間用的,類似於二維中的傾斜度,二維中的傾斜度為正的時候線向右傾斜,否則向左傾斜,同理在三維中梯度下降類似於碗裝,想要求得碗底那一點就要減,梯度上升類似於蘑菇狀,想要求得最大值,就要增加

六,程式碼實現`

'''python
    # -*- coding: utf-8 -*-
"""
Created on Fri Jan  4 20:41:37 2019

@author: ym
"""
from numpy import *

#定義sigmoid的實現
def sigmoid(data):
    return 1.0/(1+exp(-data))
#print(sigmoid(40))
#當學習指定次數後退出迴圈
def gradient_ascent_test1():
    def func(old):
        return -2*old+4
    old=-1
    news=0
    alpha=0.001    
    num=5000
    for i in range(num):
        olds=news
        news=olds+alpha*func(olds)
    return news
print(gradient_ascent_test1())
#當模型到達指定精度後停止學習
def gradient_ascent_test2():
    def func(old):
        return -2*old+4
    olds=-1
    news=0
    alpha=0.001   #步長 
    pricision=0.00001   #精度
    while (news-olds)>pricision:
        olds=news
        news=olds+alpha*func(olds)
    return news
print(gradient_ascent_test2())

#資料集前80條作為訓練集  後20條作為測試集
#載入資料
def loadDataSet():
    i=0
    dataMat=[]
    labelMat=[]
    with open('testSet.txt','r') as fp:
        for line in fp.readlines():
            if i>80:
                break
            array=line.strip().split()
            dataMat.append([1.0,float(array[0]),float(array[1])])
            labelMat.append(int(array[2]))
            i=i+1
    return dataMat,labelMat
dataMat,labelMat=loadDataSet()
#print(dataMat)
#print(labelMat)
#學習部分  獲得模型
def gradientAscent(dataMat,labelMat):
    #將python中的list轉為  Matrix
    dataMat=mat(dataMat)
    labelMat=mat(labelMat).T  # transpose()轉置  ——》》行轉置為行  行轉置為列
    m,n=shape(dataMat)     #資料集有n行  3列
    #numpy  建立一個值為1  n行1列的值   
    weights=ones((n,1))
    alpha=0.0001        #步長  學習率
    num=5000            #迭代的次數
    for k in range(num):
        tempResult=sigmoid(dataMat*weights)
        error=labelMat-tempResult
        weights=weights+alpha*dataMat.T*error
    return weights

weights=gradientAscent(dataMat,labelMat)
print(weights)

#測試模型
data=[1.0, 0.317029	,14.739025]
data=mat(data)
y=data*weights
cla=sigmoid(y)
print(y,' ',cla)
'''        

`