統計機器學習有兩種常見的機器學習演算法:logistic回歸和svm,這兩種演算法都涉及到優化問題,是非常重要的兩種機器學習演算法,尤其是logistic回歸可能是工程上用的最廣泛的機器學習演算法了。在logistic回歸中訓練分類器就是尋找最佳擬合引數,使用的是最簡單常見優化演算法 - 梯度下降法。
logistic回歸的核心是給每個特徵xi訓練出乙個最佳回歸係數wi,得到w'x,帶入到sigmoid函式,然後sigmoid函式輸出的值與0.5作比較,進行分類,而最佳回歸係數的確定就是兩部分:極大似然估計,梯度下降。
此處僅僅寫了大概過程,詳細的推導過程,見本人總結的文件:
1. 極大似然估計
極大似然估計是一種引數估計方法,在logistic回歸中被用來估計模型的引數w。簡單的講就是每個樣本的概率密度連乘積最大。
2. 梯度下降
梯度下降用來優化引數,使模型最優。
3. 向量化
將梯度下降的過程向量化,就很容易實現logistic演算法。
4. 梯度下降的優化 - sgd
在梯度下降中,哪怕更新乙個回歸係數,所有的樣本也得參與運算, 因此我們每次迭代只選擇乙個樣本或者乙個*****(當然label與之保持一致)來參與運算。收斂速度會大大提公升。
5. logistic回歸的優缺點
優點:1)本質上是線性模型,計算簡單,訓練速度快。
2)引入了sigmoid函式來進行分類,因此能夠近似的把輸出結果看做乙個概率(當然絕對不是概率),因此其輸出結果比較直觀。
缺點:1)線性,分類精度簡單,容易欠擬合。
6. 實現logistic回歸
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import time
import random
random.seed
def timing(f):
""" 裝飾器計時, 梯度下降和隨機梯度下降的時間 """
def fun(*args, **kwargs):
begin = time.clock()
returnval = f(*args, **kwargs)
print("執行時間為: ".format(f.__name__, time.clock() - begin))
return returnval
return fun
def load_data():
""" 1. 匯入testset.txt的資料 """
train_data =
with open("testset.txt", "r") as f:
for line in f.readlines():
train_data = np.array(train_data, np.float)
train_x = np.concatenate((np.ones((len(train_data),1)), train_data[:, 0:2]), axis=1)
train_y = train_data[:, 2].astype(int)
return train_x, train_y
def sigmoid(x):
""" 計算sigmoid(x)的值, numpy的exp能夠直接操作矩陣 """
return 1 / (1 + np.exp(-x))
@timing
def gradientascent(train_x, train_y, max_iter, step = 0.001):
""" 2. 梯度下降進行訓練 """
train_x = np.mat(train_x)
train_y = np.mat(train_y).t
rows, cols = train_x.shape
weights = np.ones((cols,1))
for i in range(max_iter):
# 內部每個樣本都參與了計算
value = sigmoid(train_x * weights)
error = train_y - value
weights = weights + step * train_x.t * error
return weights
@timing
def randomgradientascent(train_x, train_y, max_iter, initstep = 0.001, batchsize = 10):
""" 3. 隨機梯度下降訓練 """
rows, cols = train_x.shape
weights = np.ones((cols, ))
length = len(train_x)
for i in range(max_iter):
# 選取乙個batch進行迭代
sampleindex = random.sample(range(length), batchsize)
step = initstep + 2 / (i + 1)
value = sigmoid(np.dot(train_x[sampleindex], weights))
error = train_y[sampleindex] - value
weights = weights + step * np.dot(train_x[sampleindex].t, error)
return weights
def drawresult(train_x, train_y, weigths, title):
""" 4. 繪製分類結果 """
7. 注意
1)logistic回歸使用之前要對特徵進行歸一化,最好使其滿足0均值,單位方差。處理方式是對每一維特徵減去均值除以方差。
2)可以將標準線性回歸改為ridge,lasso形式,再應用到sigmoid函式。
參考書籍:《機器學習實戰》,《統計學習方法》
機器學習之logistic回歸
機器學習 回歸 在 機器學習之線性回歸模型 一章中,我們學習了如何使用線性模型進行回歸學習。如果要將線性模型用來分類,就要用到該章結尾介紹的廣義線性模型了。logistic回歸模型採用logistic函式來將線性回歸產生的 值z wtx b 轉化為乙個接近0或1的 y 值 y 11 e z 1 由此...
機器學習實戰 Logistic回歸
11 e z 1 1 e zz w 0x0 w1x1 w2x 2 wn xxz w 0x0 w1x1 w2x 2 wn xx z wt x z w tx 在每個特徵上都乘以乙個回歸係數,然後把所有結果值相加,將這個總和代入sigmoid函式中,進而得到乙個範圍在0 1直接的數值。1類 大於0.5 0...
機器學習logistic回歸學習總結
在說logistic回歸演算法的開始我們先來介紹一下二分分類,所謂的二分分類就是在影象識別中,輸入一張,比如做貓的識別,要麼這張輸入圖是貓,輸出y 1,要麼輸入的不輸入貓則輸出的y 0,這就表示乙個二分分類 我們在做的識別或者二分分類的時候 需要將輸入的進行轉換,轉換成乙個特徵向量,作為輸入x,我們...