机器学习:感知机+代码实现(原始+对偶形式)

简介: 机器学习:感知机+代码实现(原始+对偶形式)

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出 为实例的类别,取+1和–1二值。感知机对应于输入空间(特征空间)中将实例划分为正 负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化, 求得感知机模型。感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的输入实例进行分类。感知机1957年由 Rosenblatt提出,是神经网络与支持向量机的基础。 本章首先介绍感知机模型;然后叙述感知机的学习策略,特别是损失函数;最后介绍 感知机学习算法,包括原始形式和对偶形式,并证明算法的收敛性。


2.1感知机模型


感知机是一种线性的、二类分类模型,可以将空间划分为正类和负类,是一种判别模型,输入为具体的实例,输出为实例的类别(+1,-1)。有原始形式和对偶形式两种。感知机是神经网络和支持向量机的基础。

感知机预测是利用学习到的模型对输入实例进行类别的划分。由输入空间到输出空间有如下函数:


d9a1c437895a47caad9ce9eb5059e15f.png

42128f13df1a453e931330240f2f06c7.png

b1f87e102c254b93aba0947d105a2337.png

感知机是一种线性分类模型,属于判别模型.感知机模型的假设空间是定义在特征空间中的所有线性分类模型( linear classification model)或线性分类器(linear classifier),


即函数集合{f|f(x)=w*x+b}.


感知机有如下几何解释:线性方程 w*x+b=0

对应于特征空间R”中的一个超平面S,其中w是超平面的法向量b是超平面的截距.这个超平面将特征空间划分为两个部分.位于两部分的点(特征向量)分别被分为正、负两类.因此,超平面S称为分离超平面( separatitng hyperplane),

如图2.1所示

1b75f483366543b39998a266e1a2284c.png


b68663a8763d4024a08dcc0a3a8eb662.png

2.2感知机学习策略


数据集的线性可分性

3a44cd832e6f4890968c09c13a67e80a.png

感知机学习策略


假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面.为了找出这样的超平面,即确定感知机模型参数w,b,需要确定一个学习策略,即定义(经验损失函数并将损失函数极小化)。


损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数w,b的连续可导函数,不易优化.损失函数的另一个选择是误分类点到超平面S的总距离,这是感知机所采用的.为此,首先写出输入空间R"中任一点x0到超平面S的距离:


b498848c64e249da931435e4d666bc46.png

b63cbbe57c404844b7f2f6135add23da.png


631072c90f8144a5b6eb04786d1b72ab.png

11aba799114e4626be52e710d74b6ae1.png

显然,损失函数L(w,b)是非负的.如果没有误分类点,损失函数值是0.而且,误分类点越少,误分类点离超平面越近,损失函数值就越小.一个特定的样本点的损失函数:在误分类时是参数w,b的线性函数,在正确分类时是0.因此,给定训练数据集T,损失函数L(w,b)是w,b的连续可导函数。


感知机学习的策略是在假设空间中选取使损失函数式(2.4)最小的模型参数wb,即感知机模型.


2.3感知机学习算法


感知机学习问题转化为求解损失函数式(2.4)的最优化问题,最优化的方法是随机梯度下降法.本节叙述感知机学习的具体算法,包括原始形式和对偶形式,并证明在训练数据线性可分条件下感知机学习算法的收敛性。


感知机学习算法的原始形式

f6c70746a53a4c23ad733417dd71db7e.png


感知机学习算法是误分类驱动的,具体采用随机梯度下降法( stochasticgradient descent).首先,任意选取一个超平面w0,b0,然后用梯度下降法不断地极小化目标函数(2.5).极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。


18844c2ed28948d5a044dc4bd279abd6.png

e2aa0439c7854ad687520b52972289a0.png

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
# In[266]:
# examole 2.1
# python版本
x = np.array([[3,3], [4,3], [1,1]])
y = [1, 1, -1]
# In[306]:
"""
np.dot([2,2],[1,1])
4
np.dot([2,2],[[1],[1]])
array([4])
"""
w = [0 ,0]
b = 0
yita = 1
# In[307]:
#是否还存在误分类点
def isHasMisclassification(x, y, w, b):
    misclassification = False
    ct = 0
    misclassification_index = 0 
    for i in range(0, len(y)):
        if y[i]*(np.dot(w, x[i]) + b) <= 0:
            ct += 1
            misclassification_index = i
    if ct>0:
        misclassification = True
    return misclassification, misclassification_index
# In[308]:
# 更新系数w, b
def update(x, y, w, b, i):
    w = w + y[i]*x[i]
    b = b + y[i]
    return w, b
# In[309]:
#更新迭代
import random
def optimization(x, y, w, b):
    misclassification, misclassification_index = isHasMisclassification(x, y, w, b)
    while misclassification:
        print ("误分类的点:", misclassification_index)
        w, b = update(x, y, w, b, misclassification_index)
        print ("采用误分类点 {} 更新后的权重为:w是 {} , b是 {} ".format(misclassification_index, w, b))
        misclassification, misclassification_index = isHasMisclassification(x, y, w, b)
    return w, b
# In[310]:
optimization(x, y, w, b)
# In[311]:
w, b = optimization(x, y, w, b)
# In[312]:
w,b


f3e51c1908e947f692a8ac15baa5c0f7.png

475f3813fcf248218ecf6aa58e923483.png

7501ef68d0b74b4e9a9947f71d2ef6fc.png

1e11a90af30c4035a2cad74fc66e04da.png

0e92c64a33324667bb4aa5722d6e240e.png

算法的收敛性

5279cffb9e894330ba5fe21a5a29ad90.png


证明略

581308158a4f4fbf9526f0ccf53005fe.png


感知机学习算法的对偶形式


ee40b8842b91425081a08f9ad283082b.png


35c3cb98bf6643a6abfa2a35d32bffbf.png

af418c1df2674a28a913dc4388af0a5d.png

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
# In[266]:
# examole 2.2 (对偶形式)
# python版本
x = np.array([[3,3], [4,3], [1,1]])
x_transpose = x.T
g = np.dot(x, x_transpose)
y = [1, 1, -1]
# In[306]:
"""
np.dot([2,2],[1,1])
4
np.dot([2,2],[[1],[1]])
array([4])
"""
alfa = np.array([0, 0, 0])
b = 0
yita = 1
# In[307]:
#是否还存在误分类点
def isHasMisclassification(y, g, b):
    misclassification = False
    ct = 0
    misclassification_index = 0
    for i in range(0, len(y)):
        sum1 = 0
        for j in range(0, len(y)):
            sum1 += (alfa[j]*y[j]*g[j][i] + b)
        if y[i]*sum1 <= 0:
            ct += 1
            misclassification_index = i
    if ct > 0:
        misclassification = True
    return misclassification, misclassification_index
# In[308]:
# 更新系数alfa, b
def update(y, alfa, yita, b, i):
    alfa[i] = alfa[i] + yita
    b = b + yita*y[i]
    return alfa, b
# In[309]:
#更新迭代
import random
def optimization(y, alfa, b, yita):
    misclassification, misclassification_index = isHasMisclassification(y, g, b)
    while misclassification:
        print ("误分类的第{}点{}:".format(misclassification_index, x[misclassification_index]))
        alfa, b = update(y, alfa, yita, b, misclassification_index)
        print ("采用第{}误分类点 {} 更新后的权重为:alfa是 {} , b是 {} ".format(misclassification_index, x[misclassification_index], alfa, b))
        misclassification, misclassification_index = isHasMisclassification(y, g, b)
    return alfa, b
# In[310]:
optimization(y, alfa, b, yita)
# In[311]:
alfa, b = optimization(y, alfa, b, yita)
# In[312]:
#w=sum(alfa_i*y_i*x_i)
alfa_y = np.multiply(list(alfa),y)
w = np.dot(alfa_y,x)
b = np.dot(alfa, y)
print("w是{},b是{}".format(w, b))


结果:


误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 0 1] , b是 -1 
误分类的第1点[4 3]:
采用第1误分类点 [4 3] 更新后的权重为:alfa是 [0 1 1] , b是 0 
误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 1 2] , b是 -1 
误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 1 3] , b是 -2 
误分类的第1点[4 3]:
采用第1误分类点 [4 3] 更新后的权重为:alfa是 [0 2 3] , b是 -1 
误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 2 4] , b是 -2 
误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 2 5] , b是 -3 
误分类的第2点[1 1]:
采用第2误分类点 [1 1] 更新后的权重为:alfa是 [0 2 6] , b是 -1 
w是[2 0],b是-4

9c49d201f4c140c79db31b9a56ca4dde.png


92abf8a61cf9444e972991316d2a8589.png

代码部分参考:http://t.csdn.cn/MyEBk

目录
相关文章
|
10天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
22 2
|
13天前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
55 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
64 2
|
1月前
|
JSON 测试技术 API
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
|
1月前
|
机器学习/深度学习 算法 API
【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)
【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)
|
3月前
|
机器学习/深度学习 数据采集 算法
机器学习到底是什么?附sklearn代码
机器学习到底是什么?附sklearn代码
|
2月前
|
机器学习/深度学习 人工智能 算法
探索人工智能:机器学习的基本原理与Python代码实践
【9月更文挑战第6天】本文深入探讨了人工智能领域中的机器学习技术,旨在通过简明的语言和实际的编码示例,为初学者提供一条清晰的学习路径。文章不仅阐述了机器学习的基本概念、主要算法及其应用场景,还通过Python语言展示了如何实现一个简单的线性回归模型。此外,本文还讨论了机器学习面临的挑战和未来发展趋势,以期激发读者对这一前沿技术的兴趣和思考。
|
3月前
|
机器学习/深度学习 算法
【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
支持向量机(SVM)的介绍,包括其基本概念、与逻辑回归(LR)和决策树(DT)的直观和理论对比,如何选择这些算法,SVM为何采用间隔最大化,求解SVM时为何转换为对偶问题,核函数的引入原因,以及SVM对缺失数据的敏感性。
73 3
|
3月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
152 2