机器学习之logistic分类线性与非线性实验(续)
2015-08-09 10:36
597 查看
本节续上节
机器学习之logistic回归与分类
对logistic分类的线性与非线性进行实验。上节中的“种子”分类实例中,样本虽然有7维,但是很大很大程度上符合线性可分的,为了在说明上节中的那种logistic对于非线性不可分,进行如下的两组样本进行实验,一组线性,一组非线性,样本如下:
线性样本:
非线性样本:
为了防止完全可分,在1,2类样本的分界面上重叠一部分样本,也就是说这部分样本很难分出来,图中的样本也可以看出来。
线性与非线性样本都包含两类,每类100个样本点。
先对线性样本实验,代码同上节的大致相同:
分割结果已经错分的点(绿色标出)
下面将data换成非线性的试试:
可以看到对于非线性是不可分的,它产生的分界面似乎还是线性界面(如红线画出),红线上面的本来输入内圆的被分到了外圆导致错分,下面的本来属于外圆的本分到了内圆导致错分。
对于非线性的分类,可以再logistic基础上增加多层sigmod分类节点,也就演化为基本的神经网络模型。
机器学习之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分类节点,也就演化为基本的神经网络模型。
相关文章推荐
- C语言:整体运行流程
- H-index因素
- 正则表达式
- HDU 5364 Distribution money 模拟
- hdu 4931 /BC 4A Happy Three Friends
- FFmpeg库 32位和64位
- node.js中同步和异步共同使用时应额外注意
- iBeacon技术解析:苹果对抗NFC的利器
- 变量的注意事项
- c++动态内存分配与释放
- 有个库 snbcg ,加了宽字符版,lib和dll更名成snbcgu.lib snbcgu.dll
- JAVA环境变量配置
- 分数相加减(c++)
- 利用指针求最值
- 面向对象的数据库db4o: 初识db4o
- NYOJ 79 拦截导弹
- 【VR】Leap Motion 官网文档 ToolModel (工具模型)
- node.js文件拷贝(复制)
- 毛玻璃效果
- BestCoder Round #50 (div.2) & HDOJ5364 Search Result(模拟)