神经网络是如何工作的

原创
2020/10/15 22:52
阅读数 172

神经网络是如何去进行分类的

奶茶是一种小仙女每天都要补充的巴啦啦能量,但是我们作为直男却看不懂烧仙草和珍珠奶茶的区别,下面我们拿到了两份奶茶,我们要怎么给小仙女区别什么是珍珠奶茶,什么是烧仙草呢?

首先我们假设存在两种奶茶 一种是珍珠奶茶,一种是烧仙草,珍珠奶茶是奶茶,烧仙草也是奶茶,虽然珍珠奶茶也可能含有龟苓膏,但是烧仙草的龟苓膏更多,那么我们把烧仙草和珍珠的占的份数列一个表,有:

珍珠 龟苓膏 品种
1 2 烧仙草
2 1 珍珠奶茶

然后就有了下面这个图

X1=[1,2];
X2=[2,1];
plot(X1(1,1),X1(1,2),'or')
hold on
plot(X2(1,1),X2(1,2),'ob')
hold on

现在我们拿到一个不同成分的奶茶,我们需要构造一个方法使得我们能够清楚的分辨出哪一类是烧仙草,哪一类是珍珠奶茶,也就是用一条线对他们进行划分,当成分比例在红色一侧的为烧仙草,蓝色一侧为珍珠奶茶。
令当前的点为 烧仙草(1,2)珍珠奶茶(2,1) 分割他们的线设为 y=kx
要区分他们我们只需要找到一个K使得y=Kx 刚好能够把他们划分开来
首先我们随机一个k=0.25

k=0.25;
x=[0:0.01:4];
rate=0.1;
epoch=1;

X1=[1,2];
X2=[2,1];

plot(X1(1,1),X1(1,2),'or')
hold on
plot(X2(1,1),X2(1,2),'ob')
hold on

烧仙草(1,2) 带入 y=0.25xt=0.25*1=0.25 与我们的烧仙草(1,2) 的龟苓膏的成分含量2比少了E=t-y=(k+Δk)x-kx=0.25-2=-0.75
即我们的曲线需要向上移动的k如图
那么我们能不能直接找到Δk呢?
答案是可以的
Δk=E/x

function [error,diff_k]=train(X,k)
error=X(1,2)-myfun(X(1,1),k);
diff_k=error/X(1,1);
end

此处data1的红色线就是我们刚才找到的线,但是最后我们发现它移动过头了把红色的覆盖了

同样地,我们带入珍珠奶茶(2,1) 得到


data3的线又移动回来把蓝色的覆盖了
所以此时我们需要引入学习率(learining rate)的概念使得每次k移动的距离不那么大
即每次更新k值的时候有new_k=old_k+rate*Δk

现在我们有了一种限制移动大小的方法,能不让他一次移动到底,现在,我们尝试加大迭代的次数

随着迭代次数的增加,现在我们已经找到了一种最优的线y=kx , k=1.0937 恰好能够划分出烧仙草和珍珠奶茶的种类,当下一次我们再拿到一份奶茶的珍珠和龟苓膏的比例在直线的上侧还是下侧时,我们就能知道我们拿的是烧仙草还是珍珠奶茶了所以这里的k的值我们把它称为权重,机器学习的过程中就是保存这个权重为模型文件,当下次我们需要区分烧仙草和珍珠奶茶的时候我们把这个k值再拿出来,输入成分,我们就能判别类型了。

好耶ヾ(✿゚▽゚)ノ直男再也不怕女朋友担心我们不懂奶茶了。

附代码:

clc
clear all
close all

k=0.25;
x=[0:0.01:4];
rate=0.1;
epoch=10;

X1=[1,2];
X2=[2,1];


plot(X1(1,1),X1(1,2),'or')
hold on
plot(X2(1,1),X2(1,2),'ob')
hold on

Y=k*x;
plot(x,Y)
legend('烧仙草','珍珠奶茶','origin')
hold on

for i=1:epoch
    [error,diff_k]=train(X1,k);
    k=k+diff_k*rate;
    [error,k]
    Y=myfun(x,k);
    
    [error,diff_k]=train(X2,k);
    k=k+diff_k*rate;
    [error,k]
    Y=myfun(x,k);
    plot(x,Y)
    hold on
end

function [error,diff_k]=train(X,k)
error=X(1,2)-myfun(X(1,1),k);
diff_k=error/X(1,1);
end
function y=myfun(x,k)
y=k*x;
end
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部