标签:机器学习 logistic分类 模式识别
本节续上节
对logistic分类的线性与非线性进行实验。上节中的“种子”分类实例中,样本虽然有7维,但是很大很大程度上符合线性可分的,为了在说明上节中的那种logistic对于非线性不可分,进行如下的两组样本进行实验,一组线性,一组非线性,样本如下:
线性样本:
非线性样本:
为了防止完全可分,在1,2类样本的分界面上重叠一部分样本,也就是说这部分样本很难分出来,图中的样本也可以看出来。
线性与非线性样本都包含两类,每类100个样本点。
先对线性样本实验,代码同上节的大致相同:
%%
% * Logistic方法用于回归分析与分类设计
% * 简单0-1两类分类--非线性分类与线性分类
%
%%
clc
clear
close all
%% Load data
% * 数据预处理--分两类情况
% 并将标签重新设置为0与1,方便sigmod函数应用
data = load(‘data_test.mat‘);
data = data.data‘;
data(:,3) = data(:,3) - 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
%% 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)]);
%-------------------
figure;
index1 = find(predict==1);
data1 = (test_data(index1,:))‘;
plot(data1(1,:),data1(2,:),‘or‘);
hold on
index2 = find(predict==2);
data2 = (test_data(index2,:))‘;
plot(data2(1,:),data2(2,:),‘*‘);
hold on
indexw = find(predict‘~=(label_test+1));
dataw = (test_data(indexw,:))‘;
plot(dataw(1,:),dataw(2,:),‘+g‘,‘LineWidth‘,3);
分割结果已经错分的点(绿色标出)
下面将data换成非线性的试试:
可以看到对于非线性是不可分的,它产生的分界面似乎还是线性界面(如红线画出),红线上面的本来输入内圆的被分到了外圆导致错分,下面的本来属于外圆的本分到了内圆导致错分。
对于非线性的分类,可以再logistic基础上增加多层sigmod分类节点,也就演化为基本的神经网络模型。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:机器学习 logistic分类 模式识别
原文地址:http://blog.csdn.net/on2way/article/details/47373921