1.引导脚本ex6.m
%% Machine Learning Online Class % Exercise 6 | Support Vector Machines % % Instructions % ------------------------------------------------------------- % % This file contains code that helps you get started on the % exercise. You will need to complete the following functions: % % gaussianKernel.m % dataset3Params.m % processEmail.m % emailFeatures.m % % For this exercise, you will not need to change any code in this file, % or any other files other than those mentioned above. % %% Initialization clear; close all; clc %% =============== Part 1: Loading and Visualizing Data ================ % We start the exercise by first loading and visualizing the dataset. % The following code will load the dataset into your environment and plot the data. fprintf('Loading and Visualizing Data ...\n') % Load from ex6data1: % You will have X, y in your environment load('ex6data1.mat'); % Plot training data plotData(X, y); fprintf('Program paused. Press enter to continue.\n'); pause; %% ==================== Part 2: Training Linear SVM ==================== % The following code will train a ----linear SVM---- on the dataset and plot the % decision boundary learned. % Load from ex6data1: % You will have X, y in your environment load('ex6data1.mat'); fprintf('\nTraining Linear SVM ...\n') % You should try to change the C value below and see how the decision % boundary varies (e.g., try C = 1000) % SVM里的C某种意义上相当于回归里的1/lambda % C越大,代表SVM更倾向于将所有样本分得更正确(使J更小),使决策边界更right C = 1; model = svmTrain(X, y, C, @linearKernel, 1e-3, 20); visualizeBoundaryLinear(X, y, model); fprintf('Program paused. Press enter to continue.\n'); pause; %% =============== Part 3: Implementing Gaussian Kernel =============== % You will now implement the Gaussian kernel to use % with the SVM. You should complete the code in gaussianKernel.m % fprintf('\nEvaluating the Gaussian Kernel ...\n') x1 = [1 2 1]; x2 = [0 4 -1]; sigma = 2; sim = gaussianKernel(x1, x2, sigma); fprintf(['Gaussian Kernel between x1 = [1; 2; 1], x2 = [0; 4; -1], sigma = %f :' ... '\n\t%f\n(for sigma = 2, this value should be about 0.324652)\n'], sigma, sim); fprintf('Program paused. Press enter to continue.\n'); pause; %% =============== Part 4: Visualizing Dataset 2 ================ % The following code will load the next dataset into your environment and plot the data. fprintf('Loading and Visualizing Data ...\n') % Load from ex6data2: % You will have X, y in your environment load('ex6data2.mat'); % Plot training data plotData(X, y); fprintf('Program paused. Press enter to continue.\n'); pause; %% ========== Part 5: Training SVM with RBF Kernel (Dataset 2) ========== % After you have implemented the kernel, we can now use it to train the % SVM classifier. % fprintf('\nTraining SVM with RBF Kernel (this may take 1 to 2 minutes) ...\n'); % Load from ex6data2: % You will have X, y in your environment load('ex6data2.mat'); % SVM Parameters C = 1; sigma = 0.1; % We set the tolerance and max_passes lower here so that the code will run % faster. However, in practice, you will want to run the training to % convergence. model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); visualizeBoundary(X, y, model); fprintf('Program paused. Press enter to continue.\n'); pause; %% =============== Part 6: Visualizing Dataset 3 ================ % The following code will load the next dataset into your environment and % plot the data. % fprintf('Loading and Visualizing Data ...\n') % Load from ex6data3: % You will have X, y in your environment load('ex6data3.mat'); % Plot training data plotData(X, y); fprintf('Program paused. Press enter to continue.\n'); pause; %% ========== Part 7: Training SVM with RBF Kernel (Dataset 3) ========== % This is a different dataset that you can use to experiment with. Try % different values of C and sigma here. % Load from ex6data3: % You will have X, y in your environment load('ex6data3.mat'); % Try different SVM Parameters here [C, sigma, prediction_error, row, col] = dataset3Params(X, y, Xval, yval); % Train the SVM model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma)); visualizeBoundary(X, y, model); fprintf('Program paused. Press enter to continue.\n'); pause;
2.gaussianKernel.m
该函数计算了两个样本之间的高斯核函数值。
function sim = gaussianKernel(x1, x2, sigma) %RBFKERNEL returns a radial basis function kernel between x1 and x2 % sim = gaussianKernel(x1, x2) returns a gaussian kernel between x1 and x2 % and returns the value in sim % 确保x1 x2是列向量 x1 = x1(:); x2 = x2(:); % You need to return the following variables correctly. sim = 0; % ====================== YOUR CODE HERE ====================== % Instructions: Fill in this function to return the similarity between x1 % and x2 computed using a Gaussian kernel with bandwidth sigma % n是x1 x2的所含的特征属性个数 n = length(x1); sim = exp(-1 * sum((x1(:) - x2(:)).^2) / (2 * sigma.^2)); % ============================================================= end
3.dataset3Params.m
该函数的功能找到最优的C和sigma值。
function [C, sigma, prediction_error, row, col] = dataset3Params(X, y, Xval, yval) %DATASET3PARAMS returns your choice of C and sigma for Part 3 of the exercise %where you select the optimal (C, sigma) learning parameters to use for SVM %with RBF kernel % [C, sigma] = DATASET3PARAMS(X, y, Xval, yval) returns your choice of C and % sigma. You should complete this function to return the optimal C and % sigma based on a cross-validation set. % You need to return the following variables correctly. % C = 1; % sigma = 0.3; % ====================== YOUR CODE HERE ====================== % Instructions: Fill in this function to return the optimal C and sigma % learning parameters found using the cross validation set. % You can use svmPredict to predict the labels on the cross % validation set. For example, % temp_predictions = svmPredict(temp_model, Xval); % will return the predictions on the cross validation set. % % Note: You can compute the prediction error using % mean(double(temp_predictions ~= yval)) C_list = [0.01 0.03 0.1 0.3 1 3 10 30]; sigma_list = [0.01 0.03 0.1 0.3 1 3 10 30]; prediction_error = zeros(length(C_list),length(sigma_list)); for i = 1 : length(C_list) for j = 1 : length(sigma_list) % 用训练集训练SVM参数,得到最优的w和b temp_model= svmTrain(X, y, C_list(i), @(x1, x2) gaussianKernel(x1, x2, sigma_list(j))); % 再用交叉验证集计算使用当前w和b预测结果的准确率 temp_predictions = svmPredict(temp_model, Xval); % 计算当前的预测误差 prediction_error(i,j) = mean(double(temp_predictions ~= yval)); end end % 找到预测误差最小值所在的行和列 [row,col] = find(prediction_error == min(min(prediction_error))); % 得到最优的C和sigma的值 C = C_list(row); sigma = sigma_list(col); % ========================================================================= end
4.visualizeBoundary.m
该函数的功能是绘制SVM的决策边界。
function visualizeBoundary(X, y, model, varargin) %VISUALIZEBOUNDARY plots a non-linear decision boundary learned by the SVM % VISUALIZEBOUNDARYLINEAR(X, y, model) plots a linear decision % boundary learned by the SVM and overlays the data on it % Plot the training data on top of the boundary plotData(X, y) % Make classification predictions over a grid of values x1plot = linspace(min(X(:,1)), max(X(:,1)), 100)'; x2plot = linspace(min(X(:,2)), max(X(:,2)), 100)'; [X1, X2] = meshgrid(x1plot, x2plot); vals = zeros(size(X1)); for i = 1:size(X1, 2) this_X = [X1(:, i), X2(:, i)]; vals(:, i) = svmPredict(model, this_X); end % Plot the SVM boundary hold on contour(X1, X2, vals, [0.5 0.5], 'b'); hold off; end
其他函数都是Andrew Ng已经帮我们写好了的,相对不那么重要,就不贴上来了。
1.The dicision boundary of SVM with linear kernel:
2.The dicision boundary of SVM with gaussian kernel:
3.The dicision boundary of SVM with gaussian kernel and the best C and sigma(relatively):