感知机定义
如果有一个算法,具有1个或者多个入参,但是返回值要么是0,要么是1,那么这个算法就叫做感知机,也就是说,感知机是个算法
感知机有什么用
感知机是用来表示可能性的大小的,我们可以认为假设如果返回1,那么事情下一步的方向偏向A更大一些,如果返回0,那么事情下一步的方向偏向B更大一些,现在说这些还太早,总之我们知道感知机是用来表述可能性大小的东西就可以了
乱写一个感知机
根据定义,下面的算法是我随便写的,虽然没任何用,但是它确实是一个感知机算法,很明显,感知机算法有无穷无尽个
java语言:
public static void main(String[] args) {int result = 感知机(7, 8);System.out.println(result);
}public int 感知机(int a, int b) {if (a + b > 5) {return 1;}return 0;
}
python语言:
def perceptron(a,b): # 定义感知机算法if(a + b>5):return 1else: return 0
a,b = 7,8
result = perceptron(a,b)
print(result)
阈值与偏置:上述示例中的[5]叫做阈值,后文中我们会叫它偏置
阈值:
很明显,上述示例中的5,是我根据我脑海中的需求,随便写出来的,其他人的想法肯定是和我不太一样的,所以其他人也有可能写成a+b>999
,那么我们就说阈值是999,如果满足这个阈值,就返回1,不满足这个阈值,就返回0
偏置:
在感知机的概念中,我们通常把阈值叫做偏置,既然名词改变了,那么我们的算法也需要改变一下,变成下面这样
if(-5 + (a + b)>0):return 1
else: return 0
这个时候,我们才可以正式的说:偏置为-5
权重
这是一个非常重要的概念,在上述算法中,我没有体现出权重,也就是说,上面的代码,没有权重,或者说,上述的代码中,权重是1
那么对于感知机来说,什么是权重?没有权重会怎么样
1.什么是权重:每个入参都需要乘以一个值,至于值是多少,我们先不管,那么乘以的这个值,就叫做权重,拿上述代码来说,其实是乘以了1,就像下面这样:
# a乘以1加上b乘以1
if(-5 + (a*1 + b*1)>0):return 1
else: return 0
2.加上权重会怎么样?当然是会严重影响结果了例如,我们让参数a的权重是0.5,参数b的权重是0.1,变成下面这样
if(-5 + (a*0.5 + b*0.1)>0):return 1
else: return 0
# 此时如果a=7,b=8,那么该感知机算法会返回0,之前是返回1的,加了这个权重,变成0了
3.权重到底影响什么?权重影响的是参数,如果我们认为参数是现实中的某种决策的外在条件,那么权重会影响最终结果,例如,今天下雨天气不好,我要出去玩HR,那么请问天气不好在家
的权重大,还是出去玩HR
的权重大???如果天气不好在家
的权重非常大,只要滴几个小雨点或者阴天,那么我们就绝对不会出门,如果出去玩HR
的权重大,那么无论天气多么恶劣,我们也会出去玩HR,对不对??所以说权重会影响决策,例如下面你的代码,无论你将b设置成什么值,都不会影响结果,因为它的权重非常小
if(-5 + (a*0.5 + b*0)>0): # 我们将b的权重设置成0,相当于完全忽略b这个条件return 1
else: return 0
感知机的初步公式
我们上面介绍了入参,权重,偏置,所以得到了一个感知机公式,如下
结果0 = 偏置 + (入参1 * 入参1权重 + 入参2 * 入参2权重) <=0
结果1 = 偏置 + (入参1 * 入参1权重 + 入参2 * 入参2权重) > 0
阶跃函数与激活函数
阶跃函数是当结果超过了某个阈值,就输出另一个参数,在本文的例子中,就是大于0小于0这个过程,下面代码中的step函数,就是阶跃函数,对上文的代码进行拆分,我们拆分成两步,如下
步骤1:
结果X = 偏置 + (入参1 * 入参1权重 + 入参2 * 入参2权重)
步骤2:
def step(a): # 定义一个阶跃函数if(a>0):return 1else: return 0
结果R = step(X) # 将步骤1的结果传递到阶跃函数中,结果R要么是0,要么是1
由于阶跃函数使用起来不够平滑,平滑指的是跳跃太大了,有点像高低电平,给一个阈值,以这个阈值为门槛,这有很多缺点,我们之后再说,总之你要记住“不够平滑”,我们想要平滑,所以又提出了阶跃函数的升级版本,也叫激活函数(注意,激活是个名词,不是动词)
激活函数
这里不写了,单独拎出一片文章吧,今天该下班回家打LOL了
感知机的缺点
感知机有一个缺点,就是这个权重的设置,在本文的代码中,0.5,0.1,0什么的,这都是我随便设置的,但是现实生活中,如果想让一个算法具有智能,那么这个权重是通过大量数据总结出来的,如果想要人工总结,那么得需要大量的时间和人工成本,是否有什么办法,能够让计算机自己定义这个权重呢??
当然是有的,我们常常听到的机器学习,就是通过大量数据+一个叫做神经网络的技术,把权重算出来,当然,如果你觉得对这个权重不满意,也可以人工干扰,或者说我本身就知道应该设置权重多少,没必要进行机器学习,直接写死权重值也是可以的,不过这是后面文章的内容了
本文就到这里,介绍了一些感知机的概念