机器学习第一篇

机器学习的编程作业——optional exercise: visualizing the data

题目

建立学习模型来预测学生是否能被录取。训练集中给出了100位学生的第一次考试成绩、第二次考试成绩和是否被录取(100X3矩阵),目前需要绘制训练集数据对应的散点图。

我的代码

function plotData(X, y)
figure; hold on;
re = [X,y];
re1 = zeros(100,3);
re2 = zeros(100,3);
for i = 1:length(y)
    if re(i,3) == 1
        re1(i,:) = re(i,:); 
    else
        re2(i,:) = re(i,:);
    end
end
all(re1,2)
re1(all(re1==0,2),:)=[];
re2(all(re2==0,2),:)=[];
scatter(re1(:,1),re1(:,2),'k+','linewidth',2)
scatter(re2(:,1),re2(:,2),'ko','MarkerFaceColor','y')
hold off;
end

这段代码中比较值得注意的就是剔除掉矩阵中全零行。

先介绍两个函数:

  1. all函数:检测矩阵中是否全为非零元素,如果是则返回1,否则返回0。
  2. any函数:检测矩阵中是否有非零元素,如果是则返回1,否则返回0。
all(A)
all(A,1)%与all(A)是等价的,返回的是一个行向量。代表每一列是否全零。
all(A,2)%返回的是一个列向量,代表每一行是否是全零

剔除全零行则只需要将返回列向量中值为0的行设置为空向量即可。

A(all(A==0,2),:)=[]; 

我自己写的这个代码不得不说真的很丑。

参考答案上的代码

pos = find(y==1); neg = find(y==0);
plot(X(pos,1),X(pos,2),'k+','LineWidth',2,'MarkerSize',7);
plot(X(neg,1),X(neg,2),'ko','MarkerFaceColor','y','MarkerSize',7); 

关于find函数

k = find(X)%返回一个包含X中每个非零元素的线性索引的向量。如果X是向量,则返回方向与X相同的向量。如果X为多维函数则返回由结果的线性索引组成的列向量。
k = find(~X)%返回的就是X中零元素的线性索引了。
k = find(X,n,'first')%返回X中前n个非零元素的线性索引,一般情况可以默认不写'first'
k = find(X,n,'last')%返回X中后n个非零元素的线性索引
k = find(X<10)%按条件查找,返回满足条件元素的索引值

  

posted @ 2021-09-02 14:43  Emi-lia  阅读(47)  评论(0)    收藏  举报