机器学习(二):神经网络

在现实中,分类的对象往往非常复杂,有上千个特征,这会使得逻辑回归的分类进行十分缓慢。且当逻辑回归进行多分类时,需要分类多次才可以完成。因此提出了新的算法,神经网络。

0x01 神经网络概念

神经网络即模仿大脑的学习模式提出的一种算法,通过模拟大脑的神经元,将分类问题分步进行,由简单到复杂的进行。以下是神经网络的模型。

                              机器学习(二):神经网络_第1张图片

其中,x1到x3分别为不同的特征值,中间的a1到a3为中间层,即对于x1到x3的进一步过滤,最后输出h(x)。

下面以计算 x1 XNOR x2为例介绍神经网络的工作过程。

 

0x02 神经网络举例

e.g.  x1 XNOR x2 结构图如下所示

机器学习(二):神经网络_第2张图片

要计算x1 XNOR x2, 需要先计算x1 and x2,以及 (not x1)AND(not x2), 然后将结果采用或运算即可。

图中红色的部分是对x1 x2进行与运算,线上的数字称为权重,也就是线性回归中的theta参数。其计算过程如下

                                                                       a_{1}^{(2)} = g(-30*1 + 20*x_{1} + 20*x_{2})

其中,g(z)函数为sigmiond函数,在z大于4.6时函数值为1,在z小于-4.6时函数值为0。由上面的式子可以看出当 x1=0, x2=0时,a1=g(-30)=0,实现了AND运算。 同理,蓝色实现了(not x1)AND(not x2)运算, 绿色实现了OR运算,最终实现了求

x1 XNOR x2。

 

0x03 神经网络用于手写数字识别 matlab实现

神经网络在多分类的情况下输出的h(x)为列向量,不同的值代表不同的类别。如下图所示

机器学习(二):神经网络_第3张图片

下面以识别手写数字为例,进行预测。(训练集中的theta已经给好了 下一个笔记会将如何计算出theta)

% Load Training Data
fprintf('Loading and Visualizing Data ...\n')

load('ex3data1.mat');
m = size(X, 1);

% Randomly select 100 data points to display
sel = randperm(size(X, 1));
sel = sel(1:100);

displayData(X(sel, :));

%% ================ Part 2: Loading Pameters ================
% In this part of the exercise, we load some pre-initialized 
% neural network parameters.

fprintf('\nLoading Saved Neural Network Parameters ...\n')

% Load the weights into variables Theta1 and Theta2
load('ex3weights.mat');

%% ================= Part 3: Implement Predict =================
%  After training the neural network, we would like to use it to predict
%  the labels. You will now implement the "predict" function to use the
%  neural network to predict the labels of the training set. This lets
%  you compute the training set accuracy.

pred = predict(Theta1, Theta2, X);

fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);

fprintf('Program paused. Press enter to continue.\n');
pause;

%  To give you an idea of the network's output, you can also run
%  through the examples one at the a time to see what it is predicting.

%  Randomly permute examples
rp = randperm(m);

for i = 1:m
    % Display 
    fprintf('\nDisplaying Example Image\n');
    displayData(X(rp(i), :));

    pred = predict(Theta1, Theta2, X(rp(i),:));
    fprintf('\nNeural Network Prediction: %d (digit %d)\n', pred, mod(pred, 10));
    
    % Pause with quit option
    s = input('Paused - press enter to continue, q to exit:','s');
    if s == 'q'
      break
    end
end

主要的predict函数如下所示

function p = predict(Theta1, Theta2, X)

m = size(X, 1);
num_labels = size(Theta2, 1);

% You need to return the following variables correctly 
p = zeros(size(X, 1), 1);

X = [ones(m, 1) X];%向待测试的数据中加入X0,每一行都是一组input,对应得到一个output的行向量
z2=X*Theta1';
a2=sigmoid(z2);
a2=[ones(m, 1) a2];
z3=a2*Theta2';
a3=sigmoid(z3);
[a,p]=max(a3,[],2);

首先需要向x矩阵中加入单位列向量,保证h(x)中的常数项。

然后通过矩阵乘法分别计算a2,a3。

在最终的a3中得到的是一个5000*10的矩阵,5000代表每个图片,每一行的10个数分别代表这个值为0-9的概率。

最后的 [a,p]=max(a3,[],2) 返回a3中每一行的最大值以及最大值的索引。因此最终p中存放为为概率最大的数值的索引,即预测的数值。

最后运行结果如下

机器学习(二):神经网络_第4张图片

 

输入手写体6,识别出的结果也为6.

 

 

 

你可能感兴趣的:(机器学习)