机器学习-感知机

本文介绍了机器学习中的分类算法,包括分类的基本概念、应用实例及感知机模型。通过实例讲解了如何利用感知机找到最佳分类边界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.4 学习分类

5.4.1 什么是分类

我们知道数据研究的基础是给数据“贴标签”进行分类。类别分得越精准,我们得到的结果就越有价值。分类是一个有监督的学习过程,有监督的意思就是目标数据库中的相关数据的类别是已知的,分类过程需要做的就是把每一条记录归到对应的类别之中。由于必须事先知道各个类别的信息,并且所有待分类的数据条目都默认有对应的类别,因此分类算法也有其局限性,当上述条件无法满足时,我们就需要尝试聚类分析。而聚类就是一个无监督的学习过程,即目标数据库中的相关数据的类别是未知的,需要自行给这些数据分类,怎么分类,分多少类是聚类所要研究的问题。

5.4.2分类的应用

我们结合实际的例子来了解分类算法。我们现在来将矩形分为横向和纵向两个类别,例图5-4-1,

图5-4-1

很显然是纵向的,图5-4-2,很显然是横向的,

图5-4-2

也就是说,我们可以得到表5-4-3这样的训练数据,即宽和高的部分是数据,而形状是标签。

表5-4-3

我们现在来思考如何将这些数据可视化或者说是更容易让我们进行数学表达,那么我们可以进行坐标轴的建立,将x轴表示为矩形的宽,而y轴用来表示矩形的高,用白色表示矩形的形状是纵向,黑色表示矩形的形状是横向,这样我们就可以得到图5-4-4这样的坐标图,

图5-4-4

不过两个数据似乎太少了,我们多添加一些训练数据如表5-4-5,

表5-4-5

有利于我们理解和接下来的算法讲解,然后将这些数据全部表示在坐标轴上,如图5-4-6。

图5-4-6

我们很容易的就会找到一条直线将这六个数据进行黑白划分的线,如图5-4-7所示,但是我接下来面临的问题是如何得出这条直线。

图5-4-7

在开始找这条虚线之前,我们要学习一些概念。首先是向量的概念,向量有大小有方向,拥有很强的几何意义,其次是权重向量和法线向量,从高中数学我们知道,垂直于某一向量的向量就是该向量的法线向量,那么权重向量是什么呢,权重向量就是我们需要求解的参数,因为通过求解权重向量我们就能够得到权重向量的法线向量图5-4-7中的虚线了,我们知道某向量与该向量的法线向量即垂直的两个两个向量的内积为0,内积就是各元素相应元素乘积的和,设权重向量为w(w1,w2),设其法向量为x(x1,x2),则表达式可以写成这样

w . x = ∑wixi =w1x1+w2x2 =0

如此以来,我们只需要找到权重向量w就可以确定图中我们想要找到的分类的线了,如图5-4-8。

图5-4-8

5.4.3 感知机

我们知道理论方法后,该如何求解出权重向量从而找到分类的线。基本做法和求解回归时相同,将权重向量作为参数,通过不断的迭代来更新参数。接下来我们要了解一下被称为感知机的模型,感知机是接受多个输入后将每个值与各自的权重相乘,最后输出总和的模型。通常用图5-4-9来表示。

图5-4-9

接下来,我们慢慢来了解感知机以及参数如何进行迭代的。首先我们进行训练数据的准备。设表示宽的轴为x1、表示高的轴为x2,用y来表示图像是横轴还是纵轴,横轴的值为1、纵轴的值为-1。如下表5-4-10。

表5-4-10

接下来我们可以通过带有参数向量x(上表中的x1,x2,并非权重向量的法线向量)的函数来判断图像是横向还是纵向,即返回1或者是-1。我们称这个函数为判别函数。我们先给出这个判别函数的表达式然后再进行思考:

这个函数不一定能判别正确,因为目前还不知到我们最终想要求得的权重向量w的方向,但是我们可以通过后面提到的公式对初始化的w的迭代来提高这个判别公式的准确率。我们目前需要解决的是,如何求得这个函数的返回值,通过我们的高中知识我们可以知道内积的表达式的另一种表达形式是w.x = |w|.|x|.cosΘ,其中绝对值里的数一定是大于0的值

那么内积的符号由两个向量w和x的夹角方向决定,我们知道向量w和x的夹角是锐角或者直角那么内积大于或者等于0,返回值为1。向量w和x的夹角是钝角那么内积小于0,返回值为-1。

那么我们知道这个判别式不一定能判别正确,我们就需要不断更新w来使这个判别式的判别结果更加准确。接下来我们来了解权重向量的更新表达式,同样,我们先给出表达式,再进行分析:

首先我们来解释这个表达式的意思,fw(x(i))≠y(i)的意思是如表5-4-10中第i行里的宽高在判别函数里的返回值与真实值不同,表示判别函数的判断不正确,那么就需要更新w的值,反之如果判别函数的返回值判断正确,那么就不需要更新w的值。那么我们重点关注判别函数的判断不正确时,w如何更新,光看w := w + y(i)x(i)这个表达式的话会很难理解,我们可以结合图5-4-11来理解,我们首先初随意始化一个权重向量,就行回归确定初始一样,通过不断的迭代来找到我们最终想要的权重向w。

图5-4-11

初始权重向量确定了,假设第一个训练数据是x(1) = (125,30),我们尝试用这个数据来更新权重向量w,如图5-4-12。

图5-4-12

很显然,x与权重向量的夹角是钝角,那么判别函数的返回值为-1,而它的真实值是1,如表5-4-13所示:

表5-4-13

那么fw(x(i))≠y(i),说明判别结果有误,需要进行w的更新,所以根据表达式有

w’ = w + y(1)x(1) = w + 1.x(1)  =  w + x(1)

所以新更新的w’为两个向量的加法,向量加法如图5-4-14所示:

图5-4-14

那么 w + x(1)就是我们新更新的w,那么我们现在用新更新的w来使用判别函数得到返回值,如图5-4-15所示:

图5-4-15

很明显权重向量w与x的夹角为锐角,那么返回值与真实值相同,判别正确了。如此不断的迭代w,最终找到我们想要的那个权重向量w,这个权重向量w的法相向量就是我们刚开始想要求得的那条分类的虚线了。既然知道了原理,那我们写代码就容易很多了:

import numpy as np
import matplotlib.pyplot as plt

# 读入训练数据
train = np.loadtxt('images1.csv', delimiter=',', skiprows=1)
train_x = train[:,0:2]
train_y = train[:,2]

# 权重初始化
w = np.random.rand(2)

# 判别函数
def f(x):
    if np.dot(w, x) >= 0:
        return 1
    else:
        return -1

# 重复次数
epoch = 10

# 更新次数
count = 0

# 学习权重
for _ in range(epoch):
    for x, y in zip(train_x, train_y):
        if f(x) != y:
            w = w + y * x  #迭代公式

            # 输出日志
            count += 1
            print('第 {} 次 : w = {}'.format(count, w))

# 绘图确认
x1 = np.arange(0, 500)
plt.plot(train_x[train_y ==  1, 0], train_x[train_y ==  1, 1], 'o')
plt.plot(train_x[train_y == -1, 0], train_x[train_y == -1, 1], 'x')
plt.plot(x1, -w[0] / w[1] * x1, linestyle='dashed')
plt.show()

图片和代码引自《白话机器学习的数学》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值