逻辑回归和朴素贝叶斯算法实现二值分类(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%。
正确率都不是很高,原因有待考证。
数据简介:共有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%。
正确率都不是很高,原因有待考证。
相关文章推荐
- 朴素贝叶斯算法实现分类问题(三类)matlab代码
- 第五篇:朴素贝叶斯分类算法原理分析与代码实现
- 利用朴素贝叶斯算法进行分类-Java代码实现
- Logistic回归分类算法原理分析与代码实现
- 第五篇:朴素贝叶斯分类算法原理分析与代码实现
- 代码,逻辑回归(logistic_regression)实现mnist分类(TensorFlow实现)
- 分类算法 之 逻辑回归--理论+案例+代码
- 逻辑回归的MATLAB实现(二分类问题)
- Logistic Regression 逻辑回归算法例子,python代码实现
- 分类算法系列2----逻辑回归Logistic原理和Python实现
- 逻辑回归的MATLAB实现(二分类问题)
- 朴素贝叶斯分类算法介绍及python代码实现案例
- 第七篇:Logistic回归分类算法原理分析与代码实现
- 朴素贝叶斯分类算法原理分析与代码实现
- Logistic Regression 逻辑回归算法例子,python代码实现
- 朴素贝叶斯实现文本分类部分代码(2)
- Stanford机器学习网络课程---第三讲(续)Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
- 转:无限级分类的简单算法实现及代码重点讲解
- 初学者对K近邻分类算法的理解与matlab平台上的实现
- [ASP]无限级分类的简单算法实现及代码重点讲解http://bbs.blueidea.com/thread-1982151-1-1.html