当前位置: 代码迷 >> GIS >> 机器学习之logistic分门别类线性与非线性实验(续)
  详细解决方案

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

热度:400   发布时间:2016-05-05 06:05:46.0
机器学习之logistic分类线性与非线性实验(续)

本节续上节

机器学习之logistic回归与分类

对logistic分类的线性与非线性进行实验。上节中的“种子”分类实例中,样本虽然有7维,但是很大很大程度上符合线性可分的,为了在说明上节中的那种logistic对于非线性不可分,进行如下的两组样本进行实验,一组线性,一组非线性,样本如下:
线性样本:
这里写图片描述
非线性样本:
这里写图片描述

为了防止完全可分,在1,2类样本的分界面上重叠一部分样本,也就是说这部分样本很难分出来,图中的样本也可以看出来。
线性与非线性样本都包含两类,每类100个样本点。

先对线性样本实验,代码同上节的大致相同:

%%  % * Logistic方法用于回归分析与分类设计% * 简单0-1两类分类--非线性分类与线性分类% %% clcclearclose 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' paraweights = 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);    endend% * 整体梯度算法-批量/离线学习% 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 datadiff = 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);    endend[~,predict] = min(diff);% show the resultfigure;plot(label_test+1,'+')hold onplot(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 onindex2 = find(predict==2);data2 = (test_data(index2,:))';plot(data2(1,:),data2(2,:),'*');hold onindexw = find(predict'~=(label_test+1));dataw = (test_data(indexw,:))';plot(dataw(1,:),dataw(2,:),'+g','LineWidth',3);

这里写图片描述

分割结果已经错分的点(绿色标出)
这里写图片描述

下面将data换成非线性的试试:
这里写图片描述
这里写图片描述
可以看到对于非线性是不可分的,它产生的分界面似乎还是线性界面(如红线画出),红线上面的本来输入内圆的被分到了外圆导致错分,下面的本来属于外圆的本分到了内圆导致错分。
对于非线性的分类,可以再logistic基础上增加多层sigmod分类节点,也就演化为基本的神经网络模型。

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

  相关解决方案