专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > GIS

机器学习之logistic分门别类线性与非线性实验(续)

发布时间:2010-06-06 17:01:15 文章来源:www.iduyao.cn 采编人员:星星草
机器学习之logistic分类线性与非线性实验(续)

本节续上节

机器学习之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分类节点,也就演化为基本的神经网络模型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: