您的位置:首页 > 编程语言 > MATLAB

逻辑回归和朴素贝叶斯算法实现二值分类(matlab代码)

2016-09-08 10:54 591 查看
数据来源:http://archive.ics.uci.edu/ml/machine-learning-databases/haberman/haberman.data

数据简介:共有306组数据,每组数据有三个属性(x1,x2,x2),属于0类或者1类。

数据序号末尾为1的是测试集,有31组;其他的作为训练集,有275组。

逻辑回归程序:具体算法详见(http://blog.csdn.net/zhulf0804/article/details/52198823

clear

clc

load('X.mat');

load('Y.mat');

%数据归一化处理

X(:,1)=X(:,1)/max(X(:,1));

X(:,2)=X(:,2)/max(X(:,2));

X(:,3)=X(:,3)/max(X(:,3));

%将截距项添加至数据集X

 X=[X,ones(306,1)];

Y=Y-1;

%我们把数据集中所有序号末位为1的设定为测试集,其他的数据为训练集

% 训练集共有275,测试集共有31个

m1=275;

m2=31;

%将数据分为训练集XX1,YY1,测试集XX2,YY2。

j=1;

k=1;

for i=1:306

    if mod(i,10)==1

        XX2(j,:)=X(i,:);

        YY2(j,:)=Y(i,:);

        j=j+1;

    else

        XX1(k,:)=X(i,:);

        YY1(k,:)=Y(i,:);

        k=k+1;

    end

end

%设定学习率为0.01

delta=0.01;

%收敛到的极值是否与初值无关还待验证

theta1=rand(4,1);

%训练模型

while(1)

    dt=zeros(4,1);

    for i=1:m1

        xx=XX1(i,:)';

        yy=YY1(i);

        h=1/(1+exp(-(theta1'*xx)));

        dt=dt+(yy-h)*xx;

    end

    theta2=theta1+delta*dt;

    %norm(theta2-theta1)

    if norm(theta2-theta1)< 0.00001 break;

    end

    theta1=theta2;

    

end

%测试数据

cc=0;

for i=1:m2

    xx=XX2(i,:)';

    yy=YY2(i);

    ans=1/(1+exp(-theta2'*xx))

    if ans>0.5 && yy==1

        cc=cc+1;

    end

    if ans<=0.5 && yy==0

        cc=cc+1;

    end

end

cc/m2

测试结果: 正确率为 80%。

朴素贝叶斯算法:具体算法详见(http://blog.csdn.net/zhulf0804/article/details/52419153

% X1 30-83

% X2 58-69

% X3 0-52

%数据处理,XX1,YY1,为训练集,XX2,YY2为测试集

%我们把数据集中所有序号末位为1的设定为测试集,其他的数据为训练集

% 训练集共有275,测试集共有31个

%m1为训练集个数

%m2为测试集个数

clear

clc

load('X.mat', 'X');

load('X.mat', 'Y');

m1=275;

m2=31;

X(:,3)=X(:,3)+1;

Y=Y-1;

j=1;

k=1;

for i=1:306

    if mod(i,10)==1

        XX2(j,:)=X(i,:);

        YY2(j,:)=Y(i,:);

        j=j+1;

    else

        XX1(k,:)=X(i,:);

        YY1(k,:)=Y(i,:);

        k=k+1;

    end

end

%计算p(y=1)

cy=0;

for i=1:m1

    if(YY1(i)==1) 

        cy=cy+1;

    end

end

py=cy/m1;

%计算p(xi|y=1);

xy1=zeros(83,3);

xy0=zeros(83,3);

for i=1:m1

    if(YY1(i)==1)

        v=XX1(i,1);

        xy1(v,1)=xy1(v,1)+1;

        v=XX1(i,2);

        xy1(v,2)=xy1(v,2)+1;

        v=XX1(i,3);

        xy1(v,3)=xy1(v,3)+1;

    else

        v=XX1(i,1);

        xy0(v,1)=xy0(v,1)+1;

        v=XX1(i,2);

        xy0(v,2)=xy0(v,2)+1;

        v=XX1(i,3);

        xy0(v,3)=xy0(v,3)+1;

    end

end

xy1=xy1/cy;

xy0=xy0/(m1-cy);

%下面进行测试

%ppy1表示p(y=1|x);

cc=0;

for i=1:m2

    xx=XX2(i,:);

    ppy1=py;

    for j=1:3

        ppy1=ppy1*xy1(xx(j),j);

    end

    ppy0=1-py;

    for j=1:3

        ppy0=ppy0*xy0(xx(j),j);

    end

    ppy1=ppy1/(ppy1+ppy0)

%     if ppy1>ppy0 && YY2(i)==1

%         cc=cc+1;

%     end

%     if ppy1<ppy0 &&YY2(i)==0

%         cc=cc+1;

%     end

    if ppy1>0.5 && YY2(i)==1

        cc=cc+1;

    end

    if ppy1<=0.5 &&YY2(i)==0

        cc=cc+1;

    end

end

cc/m2

测试结果:正确率为62%。

正确率都不是很高,原因有待考证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: