準備資料:基於二值影象構造資料
分析資料:對影象向量進行目測
訓練演算法:採用三種不同的方法,不同的引數
線性分類器
二次多項式核函式
徑向基核函式
測試並計算錯誤率
本實驗使用的訓練資料如下圖所示,為若干個手寫的 0 和 9 的數字影象。
本實驗使用的測試資料如下圖所示,為若干個手寫的 0 和 9 的數字影象。
實驗的主函式如下所示:
% 功能:演示 kernel
svm演算法
clcclear all
close all
addpath('./data');
%% 測試樣本
datalength = 2;
[xtrain1, ytrain1, xtrain2, ytrain2] = readdatafromfiles('./data/trainingdigits');
[xtest1, ytest1, xtest2, ytest2] = readdatafromfiles('./data/testdigits');
% 合併樣本
x = [xtrain1, xtrain2];
y = [ytrain1, ytrain2];
% 打亂樣本順序
index = randperm(size(x, 2));
x(:, index) = x;
y(:, index) = y;
%% kernel svm 訓練
kerneltype = 'liner';
[alpha, b] = kernelsvmtrainmine(x, y, kerneltype);
%% 提取 sv
epsilon = 1e-5;
indexsv = find(alpha > epsilon);
%% 測試輸出
ytestresult1 = sign(sum(bsxfun(@times, alpha(indexsv) .* y(indexsv)', kernel(x(:, indexsv), xtest1, kerneltype))) + b);
ytestresult2 = sign(sum(bsxfun(@times, alpha(indexsv) .* y(indexsv)', kernel(x(:, indexsv), xtest2, kerneltype))) + b);
sum(ytestresult1 ~= ytest1)
sum(ytestresult2 ~= ytest2)
訓練資料和測試資料的個數為:數字0
9訓練198204
測試9789
線性分類器的結果如下所示:
型別係數
測試錯誤數
支援向量數線性無
178二次多項式核函式的結果如下所示,其中的係數是指ke
rnel
(x,x
′)=(
ξ+γx
tx′)
q 中的
γ ,並且ξ=
1 ,q=
2 :
型別係數
測試錯誤數
支援向量數
二次多項式
0.01279
二次多項式
0.12
84二次多項式
0.25185
二次多項式
0.594
48二次多項式
114814
徑向基核函式的結果如下所示,其中的係數是指ke
rnel
(x,x
′)=e
(−||
x−x′
||22
σ2) 中的 σ2
:型別係數測試錯誤數
支援向量數
徑向基0.1
97402
徑向基5
1330
徑向基10
1114
徑向基50270
從上面的測試中可以看出:
1. 引數的不同對分類的效果影響很大
2. 並不是說最小的訓練錯誤率對應於最小的支援向量數目。
3. 訓練後的識別階段並不需要所有訓練樣本,只需要支援向量
4. 線性核函式的訓練效果並不糟糕,在某些情況下如果線性核函式就以滿足要求就可不使用其他複雜核函式。
我的github
svm 支援向量機
dual svm 對偶支援向量機
kernel svm
SVM入門 手寫數字識別
svm是乙個constrained optimization problem 約束最優化問題 其中constrain是分指類,optimization是指使得margin最大 scikit learn是用於python程式語言的免費軟體機器學習庫。它具有各種分類,回歸和聚類演算法,包括支援向量機,隨...
SVM手寫數字的識別 python
svm手寫數字的識別 python 1 svm手寫數字識別 識別步驟 1 樣本影象的準備。2 影象尺寸標準化 將影象大小都標準化為8 8大小。3 讀取未知樣本影象,提取影象特徵,生成影象特徵組。4 將未知測試樣本影象特徵組送入svm進行測試,將測試的結果輸出。識別 usr bin env pytho...
手寫數字識別
這幾天在想這做字元識別方面的程式,看了很多 但是發現 上的幾乎用處都不是特別的大,理論一大堆,但是用在程式裡面則很難實現,看到有些 上說用連碼法,但是連碼法對結構的變化太敏感了,但是也從一些 裡獲得了一些靈感,我採用的是網格匹配法,準備工作採集樣本,得到了樣本的網格資訊用於接下來的識別,當然也可 一...