【SVM分類】基於粒子群演算法優化SVM實現資料分類預測matlab原始碼
一、神經網路-支援向量機
支援向量機(Support Vector Machine)是Cortes和Vapnik於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式擬合等其他機器學習問題中。 1 數學部分 1.1 二維空間 2 演算法部分
二、粒子群演算法
粒子群演算法是在1995年由Eberhart博士和Kennedy博士一起提出的,它源於對鳥群捕食行為的研究。它的基本核心是利用群體中的個體對資訊的共享從而使整個群體的運動在問題求解空間中產生從無序到有序的演化過程,從而獲得問題的最優解。設想這麼一個場景:一群鳥進行覓食,而遠處有一片玉米地,所有的鳥都不知道玉米地到底在哪裡,但是它們知道自己當前的位置距離玉米地有多遠。那麼找到玉米地的最佳策略,也是最簡單有效的策略就是搜尋目前距離玉米地最近的鳥群的周圍區域。
在PSO中,每個優化問題的解都是搜尋空間中的一隻鳥,稱之為"粒子",而問題的最優解就對應於鳥群中尋找的"玉米地"。所有的粒子都具有一個位置向量(粒子在解空間的位置)和速度向量(決定下次飛行的方向和速度),並可以根據目標函式來計算當前的所在位置的適應值(fitness value),可以將其理解為距離"玉米地"的距離。在每次的迭代中,種群中的例子除了根據自身的經驗(歷史位置)進行學習以外,還可以根據種群中最優粒子的"經驗"來學習,從而確定下一次迭代時需要如何調整和改變飛行的方向和速度。就這樣逐步迭代,最終整個種群的例子就會逐步趨於最優解。
上面的解釋可能還比較抽象,下面通過一個簡單的例子來進行說明
在一個湖中有兩個人他們之間可以通訊,並且可以探測到自己所在位置的最低點。初始位置如上圖所示,由於右邊比較深,因此左邊的人會往右邊移動一下小船。
現在左邊比較深,因此右邊的人會往左邊移動一下小船
一直重複該過程,最後兩個小船會相遇
得到一個區域性的最優解
將每個個體表示為粒子。每個個體在某一時刻的位置表示為,x(t),方向表示為v(t)
p(t)為在t時刻x個體的自己的最優解,g(t)為在t時刻所有個體的最優解,v(t)為個體在t時刻的方向,x(t)為個體在t時刻的位置
下一個位置為上圖所示由x,p,g共同決定了
種群中的粒子通過不斷地向自身和種群的歷史資訊進行學習,從而可以找到問題的最優解。
但是,在後續的研究中表表明,上述原始的公式中存在一個問題:公式中V的更新太具有隨機性,從而使整個PSO演算法的全域性優化能力很強,但是區域性搜尋能力較差。而實際上,我們需要在演算法迭代初期PSO有著較強的全域性優化能力,而在演算法的後期,整個種群應該具有更強的區域性搜尋能力。所以根據上述的弊端,shi和Eberhart通過引入慣性權重修改了公式,從而提出了PSO的慣性權重模型:
每一個向量的分量表示如下
其中w稱為是PSO的慣性權重,它的取值介於【0,1】區間,一般應用中均採用自適應的取值方法,即一開始令w=0.9,使得PSO全域性優化能力較強,隨著迭代的深入,引數w進行遞減,從而使的PSO具有較強的區域性優化能力,當迭代結束時,w=0.1。引數c1和c2稱為學習因子,一般設定為1,4961;而r1和r2為介於[0,1]之間的隨機概率值。
整個粒子群優化演算法的演算法框架如下:
step1種群初始化,可以進行隨機初始化或者根據被優化的問題設計特定的初始化方法,然後計算個體的適應值,從而選擇出個體的區域性最優位置向量和種群的全域性最優位置向量。
step2 迭代設定:設定迭代次數,並令當前迭代次數為1
step3 速度更新:更新每個個體的速度向量
step4 位置更新:更新每個個體的位置向量
step5 區域性位置和全域性位置向量更新:更新每個個體的區域性最優解和種群的全域性最優解
step6 終止條件判斷:判斷迭代次數時都達到最大迭代次數,如果滿足,輸出全域性最優解,否則繼續進行迭代,跳轉至step 3。
對於粒子群優化演算法的運用,主要是對速度和位置向量迭代運算元的設計。迭代運算元是否有效將決定整個PSO演算法效能的優劣,所以如何設計PSO的迭代運算元是PSO演算法應用的研究重點和難點。
三、程式碼
clc;clear;close all; %% 初始化種群 N = 500; % 初始種群個數 d = 24; % 空間維數 ger = 300; % 最大迭代次數 % 設定位置引數限制(矩陣的形式可以多維) vlimit = [-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5; -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5; -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5; -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;]; % 設定速度限制 c_1 = 0.8; % 慣性權重 c_2 = 0.5; % 自我學習因子 c_3 = 0.5; % 群體學習因子 for i = 1:d x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始種群的位置 end v = 0.5*rand(N, d); % 初始種群的速度 xm = x; % 每個個體的歷史最佳位置 ym = zeros(1, d); % 種群的歷史最佳位置 fxm = 100000*ones(N, 1); % 每個個體的歷史最佳適應度 fym = 10000; % 種群歷史最佳適應度 %% 粒子群工作 iter = 1; times = 1; record = zeros(ger, 1); % 記錄器 while iter <= ger for i=1:N fx(i) = calfit(x(i,:)) ; % 個體當前適應度 end for i = 1:N if fxm(i) > fx(i) fxm(i) = fx(i); % 更新個體歷史最佳適應度 xm(i,:) = x(i,:); % 更新個體歷史最佳位置 end end if fym > min(fxm) [fym, nmax] = min(fxm); % 更新群體歷史最佳適應度 ym = xm(nmax, :); % 更新群體歷史最佳位置 end v = v * c_1 + c_2 * rand *(xm - x) + c_3 * rand *(repmat(ym, N, 1) - x);% 速度更新 % 邊界速度處理 for i=1:d for j=1:N if v(j,i)>vlimit(i,2) v(j,i)=vlimit(i,2); end if v(j,i) < vlimit(i,1) v(j,i)=vlimit(i,1); end end end x = x + v;% 位置更新 % 邊界位置處理 for i=1:d for j=1:N if x(j,i)>limit(i,2) x(j,i)=limit(i,2); end if x(j,i) < limit(i,1) x(j,i)=limit(i,1); end end end record(iter) = fym;%最大值記錄 iter = iter+1; times=times+1; end disp(['最小值:',num2str(fym)]); disp(['變數取值:',num2str(ym)]); figure plot(record) xlabel('迭代次數'); ylabel('適應度值')
5.參考文獻:
書籍《MATLAB神經網路43個案例分析》
完整程式碼下載或者模擬諮詢https://www.cnblogs.com/ttmatlab/p/14882966.html