监督学习-2-感知器算法

第二节感知器算法

与回归算法不同,感知算法是一种分类算法,这类算法主要能回答的问题主要是yes or no
比如以某个学生的条件是否能上这所学校?
顾客是否会购买某样商品?
这位患者是否病了?
或者患者的这种现象是否可以确诊为某项疾病?
分类问题作为机器学习的根基,感知器算法也是神经网络中的基础


首先我们要解决的问题是,什么是分类问题?
这里写图片描述
举个例子,一所学校要招收学生对学生的评价主要侧重在两个方面,考试成绩在校期间的的平时成绩,这个图中显示的是对于不同的考试成绩以及不同的在校平时成绩以往的招收情况,蓝色代表成功招收,红色代表学生未被录取,我们的任务是根据这个以往的招收情况判断某个学生在有意愿报考这所学校时是否会被招收

例如这里有两个学生,他们在校的平时成绩以及最终的考试分别为[3,4]以及[9,8]也就是我们图中的对号所在的点以及叉号所在的点,根据我们肉眼的判断可以轻易的辨别出这两个点是否会被录取,那么机器要如何判断呢?

我们明显的在图中能看到有一条分界线将被录取和没有被录取的学生分割成两个部分(而现实中的大多数情况下,不会有如此明确有分隔的数据),那么我们的任务就是找出分隔这两类点的那条分边界,通过判断我们给出点的上方还是下方来判断,判断一个点在直线上方或者直线下方很好去判断
例如直线的方程是
ax+by+c=0
那么我们判断一个点在直线的上面还是下面就只需要将点[x,y]带入直线方程,当带入后方程本身大于零则说明在直线上方,否则则证明点在直线下方

还有就是对于多维情况下,是否同样适用呢?对于多维情况下,那么分界的方程就是
aw1+bw2+cw3+dw4……+e=0
这是一个超平面,然而和二维的情况下一样,只要我们判断的是一个二分类问题,维度相同的数据带进去就一样能够得出在这个超平面的上面或者下面,只是可能比较抽象,其实归根结底是和二维的情况下很像

这仅仅是一个分类算法,而我们所说的感知器是是什么呢
这里写图片描述

图中这就是一个感知器,一个数据的参数传进去,他的返回值是一个布尔值,例如在前面的是否会被录取的算法中,我们把平时成绩以及测试成绩传进去,感知器会返回一个是否被录取的返回值,同理在多维的情况下,则是这样的情况

这里写图片描述

我们这里返回的是yes或者no,其实这里还隐藏了一个阶跃函数,一般情况下,是这样的

这里写图片描述

前一个感知器放回0/1,通过后面的额阶跃函数来判断yes或者no,这仅仅是一个感知器,神经网络就是由多个感知器组合而成的,就想真实的一个个神经一样,有多个神经触突进行接受信息,由一个树突向下一层传递,在涉及到这些东西直线我们先说明对于一个感知器是如何对点进行分类的

计算机并不知道应该如何将他们进行分类,一般的做法是随机生成一条直线,然后根据各个点进行调整(是的这里很像上次说的寻找回归直线的做法),那么既然是调整得到的我们就先生成这么一条直线
这里写图片描述
假设方程是3x1+4x2-10=0,上方蓝色的部分是大于零的部分,下方红色是带入后小于零的部分,这里假设有一个红色的点被错误的分类到蓝色的部分

这里写图片描述

我们应该做就是调整直线的方程使得直线去接近这个被错误分类的点,那么怎么使得直线接近点呢?
其实很简单,就这个情况为例直线方程为3x1+4x2-10=0被错误分类的点的方程为[4,5]
设学习率为0.1
接近后的方程为
(3-0.1*4)x1+(4-0.1*5)+(-10-0.1*1)=0
也就是
(3-0.4)x1+(4-0.5)x2+(-10-0.1)=0
化简为
2.6x1+3.5x2-10.1=0
我们不做证明,关于学习率的内容上一篇已将介绍了
当这个点在直线上方时为+下方时为-

这个比较简单大家可以自己去试一试,代码放在这里

import numpy as np
# Setting the random seed, feel free to change it and see different solutions.
np.random.seed(42)

def stepFunction(t):
    if t >= 0:
        return 1
    return 0

def prediction(X, W, b):
    return stepFunction((np.matmul(X,W)+b)[0])

# TODO: Fill in the code below to implement the perceptron trick.
# The function should receive as inputs the data X, the labels y,
# the weights W (as an array), and the bias b,
# update the weights and bias W, b, according to the perceptron algorithm,
# and return W and b.
def perceptronStep(X, y, W, b, learn_rate = 0.01):
    # Fill in code
    for i in range(len(X)):
        y_hat=prediction(X[i],W,b)
        if y[i]-y_hat == 1:
            W[0] += X[i][0]*learn_rate
            W[1] += X[i][1]*learn_rate
            b += learn_rate
        elif y[i]-y_hat == -1:
            W[0] -= X[i][0]*learn_rate
            W[1] -= X[i][1]*learn_rate
            b -= learn_rate

    return W, b

# This function runs the perceptron algorithm repeatedly on the dataset,
# and returns a few of the boundary lines obtained in the iterations,
# for plotting purposes.
# Feel free to play with the learning rate and the num_epochs,
# and see your results plotted below.
def trainPerceptronAlgorithm(X, y, learn_rate = 0.01, num_epochs = 25):
    x_min, x_max = min(X.T[0]), max(X.T[0])
    y_min, y_max = min(X.T[1]), max(X.T[1])
    W = np.array(np.random.rand(2,1))
    b = np.random.rand(1)[0] + x_max
    # These are the solution lines that get plotted below.
    boundary_lines = []
    for i in range(num_epochs):
        # In each epoch, we apply the perceptron step.
        W, b = perceptronStep(X, y, W, b, learn_rate)
        boundary_lines.append((-W[0]/W[1], -b/W[1]))
    return boundary_lines

data.csv

0.78051,-0.063669,1
0.28774,0.29139,1
0.40714,0.17878,1
0.2923,0.4217,1
0.50922,0.35256,1
0.27785,0.10802,1
0.27527,0.33223,1
0.43999,0.31245,1
0.33557,0.42984,1
0.23448,0.24986,1
0.0084492,0.13658,1
0.12419,0.33595,1
0.25644,0.42624,1
0.4591,0.40426,1
0.44547,0.45117,1
0.42218,0.20118,1
0.49563,0.21445,1
0.30848,0.24306,1
0.39707,0.44438,1
0.32945,0.39217,1
0.40739,0.40271,1
0.3106,0.50702,1
0.49638,0.45384,1
0.10073,0.32053,1
0.69907,0.37307,1
0.29767,0.69648,1
0.15099,0.57341,1
0.16427,0.27759,1
0.33259,0.055964,1
0.53741,0.28637,1
0.19503,0.36879,1
0.40278,0.035148,1
0.21296,0.55169,1
0.48447,0.56991,1
0.25476,0.34596,1
0.21726,0.28641,1
0.67078,0.46538,1
0.3815,0.4622,1
0.53838,0.32774,1
0.4849,0.26071,1
0.37095,0.38809,1
0.54527,0.63911,1
0.32149,0.12007,1
0.42216,0.61666,1
0.10194,0.060408,1
0.15254,0.2168,1
0.45558,0.43769,1
0.28488,0.52142,1
0.27633,0.21264,1
0.39748,0.31902,1
0.5533,1,0
0.44274,0.59205,0
0.85176,0.6612,0
0.60436,0.86605,0
0.68243,0.48301,0
1,0.76815,0
0.72989,0.8107,0
0.67377,0.77975,0
0.78761,0.58177,0
0.71442,0.7668,0
0.49379,0.54226,0
0.78974,0.74233,0
0.67905,0.60921,0
0.6642,0.72519,0
0.79396,0.56789,0
0.70758,0.76022,0
0.59421,0.61857,0
0.49364,0.56224,0
0.77707,0.35025,0
0.79785,0.76921,0
0.70876,0.96764,0
0.69176,0.60865,0
0.66408,0.92075,0
0.65973,0.66666,0
0.64574,0.56845,0
0.89639,0.7085,0
0.85476,0.63167,0
0.62091,0.80424,0
0.79057,0.56108,0
0.58935,0.71582,0
0.56846,0.7406,0
0.65912,0.71548,0
0.70938,0.74041,0
0.59154,0.62927,0
0.45829,0.4641,0
0.79982,0.74847,0
0.60974,0.54757,0
0.68127,0.86985,0
0.76694,0.64736,0
0.69048,0.83058,0
0.68122,0.96541,0
0.73229,0.64245,0
0.76145,0.60138,0
0.58985,0.86955,0
0.73145,0.74516,0
0.77029,0.7014,0
0.73156,0.71782,0
0.44556,0.57991,0
0.85275,0.85987,0
0.51912,0.62359,0

结果:
这里写图片描述
我们可以清晰的看到直线的移动

猜你喜欢

转载自blog.csdn.net/qq_41249913/article/details/82725263