1. 程式人生 > >機器學習之logistic迴歸與分類

機器學習之logistic迴歸與分類

logistic迴歸與分類是一種簡單的分類演算法。在分類的過程中只需要找到一個劃分不同類的權重向量即可,對新的資料只需要乘上這個向量並比較就可以得到分類。比如下圖的二分類問題:
這裡寫圖片描述
每個樣本點可以看成包含兩個特徵(x1,x2),現在需要把他們分開,如果這是訓練集,他們本身屬於哪一個類是已知的,比如說藍色的屬於0類,紅色的屬於1類,現在我們想通過這些資料建立一個分類標準可以將他們分開,這樣再來了一個不知道類別的資料,我們看看這個標準就知道他是屬於哪一類的。

像上面這個線性的,那麼我們可以建立一個函式模型,假設有一個函式z=w1x1+w2x2可以將他們分開,也就是每一個樣本(x1,x2)通過這個函式有一個z,當z大於某個值就認為屬於第一類,否則屬於第二類。那麼我們知道,樣本確定後(x1,x2)不能變了,那麼我們想辦法變化這個函式的權值係數(w1,w2)。這個簡單的式子可以化簡成x

2=kx1+b的形式,看到這不是一元函式嗎,只要有了適當的k和b就可以畫出上面的分割線是不是。

下面的問題,如何找到w1與w2,因為我們的資料是已知屬於哪一類的了,那麼這樣的話我們可以開始隨機給一組w1與w2,然後將每個點(或者所有點)帶到這個函式中,假設我們的z的閾值給的是100,那麼帶一個點(x1,x2)進去算,發現得到的z=50,劃分到第一類,然而實際情況是第二類,劃分錯了,這樣我們調整一下(w1,w2),再來劃分下一個點,就這樣一直下去直到(w1,w2)能很好的劃分出這些資料為止。

Logistic尋找引數的過程就是這樣,那麼這裡就有幾個問題:
(1)關於閾值z=50的選擇
為什麼你選擇50,不是100,200呢?我們知道當x1與x2的數值(範圍)變化了之和,這個閾值會變化的。所以為了消除這個影響,我們將得到的z在進行一個對映,這個對映函式就是sigmod函式,函式的形式如下:

σ(z)=11+ez
這個函式的特點就是無論給的輸入z多大多小,輸出的值都在0-1之間。這樣對於所有二分類情況,我們就可以統一把閾值設定為0.5,一半一類一半另一類正好。那麼輸出的z(z還是通過上面的函式權值相乘而來)經過這個對映後就變化到0-1之間的一個值了,用一個圖表示如下:
這裡寫圖片描述

可能會說,將數值對映到0-1之間的方式有很多,為什麼單單選擇這個呢?我感覺這和神經網路裡面用sigmod函式作為對映關係差不多,在那裡用這個函式的作用就在於這個函式求導後的值可以用自身表示出來,而這裡將值轉化到0-1以後,分類問題就好似概率問題了。

在logistic中,我們採用的是梯度上升(與下降類似)演算法來更新權值,用誤差函式對各個權值引數求導數。

J(w)w=w12i=1m(hw(x)y)2=(hw(x)y)x(i)
那麼w的更新如下:w=w+J(w)w
關於詳細原理可參考:梯度下降法

(2)關於適用的分類說明
logistic一般適用於簡單線性的二分類問題,雖然sigmod的對映不是線性的,但是輸入到sigmod的值確是由線性求和而來,並且這個求和佔主要因素。在二分類裡面,一般將分類問題轉化為0-1分類的標籤,加入要分類的樣本的分類標籤不是0-1,那麼需要轉化過來,因為sigmod函數出來的就是0-1之間的數字,要想有梯度,要想有反饋輸出值必須在這個量級的才行。
這是二分類問題。那麼logistic能不能多分類?可以,將多分類轉化為所有的多個二分類問題,然後對樣本,先依次進行二分類,最後舉手表決哪個類最多就屬於哪個類,這樣就可以實現多分類了。

下面在matlab下試驗logistic迴歸分類,包括二分類以及多分類。
首先是樣本的選擇,這個樣本曾經在

將資料存為txt儲存到matlab工作目錄下。
先進行二分類,樣本還是這個,不過將裡面1,2類或者2,3類或者1,3類的資料提取出來,單單對這兩個類分類。

%%  
% * Logistic方法用於迴歸分析與分類設計
% * 簡單0-1兩類分類
% 
%% 
clc
clear
close all
%% Load data
% * 資料預處理--這裡因為只分兩類情況,所以挑選出1,2類資料,
% 並將標籤重新設定為0與1,方便sigmod函式應用 
data = importdata('data.txt');
index = find((data(:,8)==1)|(data(:,8)==2));
data = data(index,:);
data(:,8) = data(:,8) - 1;
%選擇訓練樣本個數
num_train = 50;
%構造隨機選擇序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
label_train = train_data(:,end);
test_data = data(choose(num_train+1:end),:);
label_test = test_data(:,end);
data_D = size(train_data,2) - 1;
% initial 'weights' para
weights = ones(1,data_D);
%% training data weights
% * 隨機梯度上升演算法-線上學習
for j = 1:100
    alpha = 0.1/j;
    for i = 1:length(train_data)
        data = train_data(i,1:end-1);
        h = 1.0/(1+exp(-(data*weights')));
        error = label_train(i) - h;
        weights = weights + (alpha * error * data);
    end
end
% * 整體梯度演算法-批量/離線學習
% for j = 1:2000
%     alpha = 0.1/j;
% %     alpha = 0.001;
%     data = train_data(:,1:end-1);
%     h = 1./(1+exp(-(data*weights')));
%     error = label_train - h;
%     weights = weights + (alpha * data' * error)';
% end
%% test itself (the training data)
diff = zeros(2,length(train_data));
for i = 1:length(train_data)
    data = train_data(i,1:end-1);
    h = 1.0/(1+exp(-(data*weights')));
    %compare to every label
    for j = 1:2 
        diff(j,i) = abs((j-1)-h);
    end
end
[~,predict] = min(diff);
%show the result
figure;
plot(label_train+1,'+')
hold on
plot(predict,'or');
hold on 
plot(abs(predict'-(label_train+1)));
axis([0,length(train_data),0,3])
accuracy = length(find(predict'==(label_train+1)))/length(train_data);
title(['predict Training Data and the accuracy is :',num2str(accuracy)]);
%% predict the testing data
diff = zeros(2,length(test_data));
for i = 1:length(test_data)
    data = test_data(i,1:end-1);
    h = 1.0/(1+exp(-(data*weights')));
    %compare to every label
    for j = 1:2 
        diff(j,i) = abs((j-1)-h);
    end
end
[~,predict] = min(diff);
% show the result
figure;
plot(label_test+1,'+')
hold on
plot(predict,'or');
hold on 
plot(abs(predict'-(label_test+1)));
axis([0,length(test_data),0,3])
accuracy = length(find(predict'==(label_test+1)))/length(test_data);
title(['predict the testing data and the accuracy is :',num2str(accuracy)]);

一次結果如下:
這是對訓練樣本訓練出引數後再回去看看它的準確率。
這裡寫圖片描述

這是測試樣本的準確率。
這裡寫圖片描述

在程式裡面可以看到,有尖鋒的地方就是分錯了的地方。對於樣本訓練得到引數w有兩種方式,一種是批量的一種是單個的,也叫作離線學習與線上學習,對訓練樣本的選擇以及引數的設定不同得到的結果都會不一樣,可以試試。

下面進行多類問題的分類,多類分類就要將所有樣本全部用上,這裡其實一共就3類,不過也算是多類。程式碼如下:

%%  
% * Logistic方法用於迴歸分析與分類設計
% * 多類問題的分類
% 
%% 
clc
clear
close all
%% Load data
% * 資料預處理--這裡因為只分兩類情況,所以挑選出1,2類資料,
% 並將標籤重新設定為01,方便sigmod函式應用 
data = importdata('data.txt');
%選擇訓練樣本個數
num_train = 50;
%構造隨機選擇序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
label_train = train_data(:,end);
test_data = data(choose(num_train+1:end),:);
label_test = test_data(:,end);
data_D = size(train_data,2) - 1;
% initial 'weights' para
% label number
cluster_num = 3;
% n*(n-1)/2
weights = ones(cluster_num*(cluster_num-1)/2,data_D);
%% training data weights
% * 隨機梯度上升演算法-線上學習
t = 1;
for index1 = 1:cluster_num-1
    for index2 = index1+1:cluster_num
        index_c = find((train_data(:,8)==index1)|(train_data(:,8)==index2));
        train_data_temp = train_data(index_c,:);
        train_data_temp(find((train_data_temp(:,8)==index1)),8) = 0;
        train_data_temp(find((train_data_temp(:,8)==index2)),8) = 1;
        %----------------------------
        for j = 1:100
            alpha = 0.1/j;
            for i = 1:length(train_data_temp)
                data = train_data_temp(i,1:end-1);
                h = 1.0/(1+exp(-(data*weights(t,:)')));
                error = train_data_temp(i,8) - h;
                weights(t,:) = weights(t,:) + (alpha * error * data);
            end
        end
        t = t + 1;
    end
end
%
%% test itself (the training data)
%
predict = zeros(length(train_data),cluster_num);
for i = 1:length(train_data)
    t = 1;
    data = train_data(i,1:end-1);
    for index1 = 1:cluster_num-1
        for index2 = index1+1:cluster_num
            h = 1.0/(1+exp(-(data*weights(t,:)')));
            if h < 0.5
                predict(i,index1) = predict(i,index1) + 1;
            else
                predict(i,index2) = predict(i,index2) + 1;
            end
            t = t + 1;
        end
    end
end 
[~,predict] = max((predict'));
%% show the result
figure;
plot(train_data(:,8),'+')
hold on
plot(predict,'or');
hold on 
plot(abs(predict'-train_data(:,8)));
axis([0,length(train_data),0,5])
accuracy = length(find(predict'==train_data(:,8)))/length(train_data);
title(['predict Training Data and the accuracy is :',num2str(accuracy)]);
%
%% predict the testing data
%
predict = zeros(length(test_data),cluster_num);
for i = 1:length(test_data)
    t = 1;
    data = test_data(i,1:end-1);
    for index1 = 1:cluster_num-1
        for index2 = index1+1:cluster_num
            h = 1.0/(1+exp(-(data*weights(t,:)')));
            if h < 0.5
                predict(i,index1) = predict(i,index1) + 1;
            else
                predict(i,index2) = predict(i,index2) + 1;
            end
            t = t + 1;
        end
    end
end 
[~,predict] = max((predict'));
%% show the result
figure;
plot(test_data(:,8),'+')
hold on
plot(predict,'or');
hold on 
plot(abs(predict'-test_data(:,8)));
axis([0,length(test_data),0,5])
accuracy = length(find(predict'==test_data(:,8)))/length(test_data);
title(['predict the testing data and the accuracy is :',num2str(accuracy)]);

訓練樣本本身結果:
這裡寫圖片描述
測試樣本結果:
這裡寫圖片描述
程式中是一種投票表決的模式,採用多個二分類來進行的多分類。

相關推薦

機器學習logistic迴歸分類

logistic迴歸與分類是一種簡單的分類演算法。在分類的過程中只需要找到一個劃分不同類的權重向量即可,對新的資料只需要乘上這個向量並比較就可以得到分類。比如下圖的二分類問題: 每個樣本點可以看成包含兩個特徵(x1,x2),現在需要把他們分開,如果這是訓練

機器學習logistic迴歸演算法程式碼實現

                                       Logistic迴歸演算法與程式

機器學習logistic迴歸

logistic迴歸又稱logistic迴歸分析,是一種廣義的線性迴歸分析模型,它解決的是分類問題,常用於資料探勘,疾病自動診斷,經濟預測等領域。 1.logistic迴歸和線性迴歸的區別 logistic迴歸和線性迴歸的區別在於以下幾點: 1)線性迴歸要求變數

機器學習 Logistic 迴歸(邏輯迴歸)

目錄 Logistic迴歸 部落格園地址:https://www.cnblogs.com/chenyoude/ git 地址:https://github.com/nickcyd/machine_learning 微信:a1171958281 Logistic 迴

機器學習logistic迴歸的梯度上升演算法

#coding=utf-8#logistic迴歸的梯度上升法from numpy import *import matplotlib.pyplot as plt#載入資料集def loadDataSet():     dataMat = [];     labelMat = []     fr = open(

機器學習邏輯迴歸logistic regression)

概述 邏輯斯蒂迴歸實質是對數機率迴歸(廣義的線性迴歸),是用來解決分類問題的。 其中sigmoid用來解決二分類問題,softmax解決多分類問題,sigmoid是softmax的特殊情況。 數學建模直接針對分類可能性建模。 引數學習可用極大似然估計

sklearn機器學習邏輯迴歸分類

物以類聚,人以群分。 是非黑白,金木水火。 乾坤陰陽,寒暑燥溼。     import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model #訓練資

機器學習SVM初解淺析(一):最大距離

機器學習 svm 最大距離 2 / ||w|| 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就是比較抽象,特別是對於像本人這種I

機器學習SVM初解淺析(一):

機器學習 svm 最大距離 2 / ||w||sdsshngshan‘gccha 這段時間在看周誌華大佬的《機器學習》,在看書的過程中,有時候會搜搜其他人寫的文章,對比來講,周教授講的內容還是比較深刻的,但是前幾天看到SVM這一章的時候,感覺甚是晦澀啊,第一感覺就

機器學習決策樹隨機森林模型

會有 strong pytho red -s 很多 4.5 是我 機器 歡迎大家前往騰訊雲技術社區,獲取更多騰訊海量技術實踐幹貨哦~ 作者:汪毅雄 導語 本文用容易理解的語言和例子來解釋了決策樹三種常見的算法及其優劣、隨機森林的含義,相信能幫助初學者真正地理解相關知識

機器學習Logistic 回歸算法

簡單 生成 選擇 效率 split max 坐標 opened 似然函數 1 Logistic 回歸算法的原理 1.1 需要的數學基礎 我在看機器學習實戰時對其中的代碼非常費解,說好的利用偏導數求最值怎麽代碼中沒有體現啊,就一個簡單的式子:θ= θ - α Σ [( hθ(

機器學習實戰——Logistic迴歸 實現記錄

問題:NameError: name 'weights' is not defined 屬於作者的排版錯誤; weights = logRegres.gradAscent(dataArr,labelMat) 所以:        weig

機器學習----目標檢測目標跟蹤的區別

1.目標檢測就是檢測出一個圖片或者一個視訊中目標的位置(靜態或者動態)如yolo檢測目標 2.目標追蹤是給視訊中第一幀目標以及它的位置,然後跟蹤這個目標,以及預測它的軌跡,(如果出現一些遮擋,也可以根據軌跡來跟蹤這個目標,假如是yolo檢測出的目標,有時候還會出現丟幀的情況,如果用了跟蹤演算法,

機器學習---似然概率

“概率”描述了給定模型引數後,描述結果的合理性,而不涉及任何觀察到的資料。 拋一枚均勻的硬幣,拋20次,問15次拋得正面的可能性有多大? 這裡的可能性就是”概率”,均勻的硬幣就是給定引數θ=0.5 ,“拋20次15次正面”是觀測值O。求概率P(H=15|θ=0.5)=

[三]機器學習決策樹隨機森林

3.1 目標任務 1.學習決策樹和隨機森林的原理、特性 2.學習編寫構造決策樹的python程式碼 3.學習使用sklearn訓練決策樹和隨機森林,並使用工具進行決策樹視覺化 3.2 實驗資料 資料集:鳶尾花資料集,詳情見[機器學習之迴歸]的Logistic迴歸實驗 3.3

JavaScript機器學習線性迴歸

譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。 原文: Machine Learning with JavaScript : Part 1 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。

【ML2】機器學習線性迴歸

【知識儲備】 線性迴歸: 1: 函式模型(Model): 假設有訓練資料   那麼為了方便我們寫成矩陣的形式   2: 損失函式(cost):  現在我們需要根據給定的X求解W的值,這裡採用最小二乘法。   

機器學習線性迴歸SVR

機器學習之線性迴歸SVR # -*- coding: utf-8 -*- """ Created on Sun Dec 2 09:53:01 2018 @author: muli """ import matplotlib.pyplot as plt import

吳恩達機器學習邏輯迴歸理論部分

一.特徵函式 對應分類問題,我們先針對二分類問題進行討論,對應計算機而言,分類即將資料按其特徵值不同分為不同的集合,僅對應二分類問題,我們只需考慮分為:正類和負類,為此我們引入特徵函式。 y=1 — 代表二分類中的正類 y=0 — 代表二分類中的反類 這是特殊函式

機器學習模型評估引數調優

一、流水線工作流        在利用訓練資料對模型進行擬合時已經得到一些引數,使用流水線可以避免在將模型用於新資料時重新設定這些引數。利用sklearn中的Pipline類,使得我們可以擬合出包含任意多個處理步驟的模型,並將模型用於新資料的預測。 1. # Title