感知机及其R实现

感知机及其R实现感知机1.感知机模型定义:假设输入空间(特征空间)是χ⊆Rn\chi\subseteqR^n,输出空间是Y={+1,−1}Y=\{+1,-1\}。输入x∈χx\in\chi表示实例的特征向量,对应于输入空间的点;输出y∈Yy\inY表示实例的类别。由输入空间到输出空间的如下函数f(x)=sign(w⋅x+b)f(x)=sign(w\cdotx+b)称为感知机。其中,ww和bb为感知

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

感知机

1. 感知机模型

定义:假设输入空间(特征空间)是 χ ⊆ R n \chi\subseteq R^n χ⊆Rn,输出空间是 Y = { + 1 , − 1 } Y=\{+1,-1\} Y={
+1,−1}
。输入 x ∈ χ x\in \chi x∈χ表示实例的特征向量,对应于输入空间的点;输出 y ∈ Y y\in Y y∈Y表示实例的类别。由输入空间到输出空间的如下函数
f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w\cdot x+b) f(x)=sign(w⋅x+b)
称为感知机。其中, w w w和 b b b为感知机模型参数, w ∈ R n w\in R^n w∈Rn叫做权值, b ∈ R b\in R b∈R叫做偏置, w ⋅ x w\cdot x w⋅x表示 w w w和 x x x的内积。 s i g n sign sign为符号函数。

2. 感知机学习策略

2.1数据集的线性可分性定义:

给定一个数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x n , y n ) } , T = \{(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)\}, T={
(x1​,y1​),(x2​,y2​),⋯,(xn​,yn​)},

其中, x i ∈ χ = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , ⋯   , N , x_i\in\chi=R^n,y_i\in Y=\{+1,-1\},i=1,2,\cdots,N, xi​∈χ=Rn,yi​∈Y={
+1,−1},i=
1,2,⋯,N,
如果存在某个超平面S
w ⋅ x + b = 0 w\cdot x+b=0 w⋅x+b=0
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有的 y i = + 1 y_i=+1 yi​=+1的实例 i i i,有 w ⋅ x i + b > 0 w\cdot x_i+b>0 w⋅xi​+b>0,对所有的 y i = − 1 y_i=-1 yi​=−1的实例 i i i,有 w ⋅ x i + b < 0 , w\cdot x_i+b<0, w⋅xi​+b<0,则成数据集 T T T为线性可分数据集;否则,成数据集 T T T为线性不可分。

2.2感知机学习策略的损失函数

感知机 s i g n ( w ⋅ x + b ) sign(w\cdot x+b) sign(w⋅x+b)学习的损失函数定义为
L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b) L(w,b)=−xi​∈M∑​yi​(w⋅xi​+b)
其中, M M M为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。损失函数 L ( w , b ) L(w,b) L(w,b)是 w w w, b b b的连续可导函数。

3. 感知机学习算法

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

输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} T={
(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)}
,其中 x i ∈ χ = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , ⋯   , N x_i \in\chi=R^n,y_i\in Y=\{+1,-1\},i=1,2,\cdots,N xi​∈χ=Rn,yi​∈Y={
+1,−1},i=
1,2,⋯,N
;学习率 η ( 0 < η ≤ 1 ) ; \eta(0<\eta\le1); η(0<η≤1);
输出: w , b w,b w,b;感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w\cdot x+b) f(x)=sign(w⋅x+b).
(1)选取初值 w 0 , b 0 w_0,b_0 w0​,b0​
(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi​,yi​)
(3)如果 y i ( w ⋅ x i + b ) ≤ 0 y_i(w\cdot x_i +b)\le 0 yi​(w⋅xi​+b)≤0
w ← w + η y i x i b ← b + η y i w\leftarrow w +\eta y_ix_i\\ b\leftarrow b +\eta y_i w←w+ηyi​xi​b←b+ηyi​
(4)转至(2),直至训练集中没有误分类点。

3.2 R语言实现(感知机学习算法的原始形式)

percept <- function(data = data,eta = eta ){
  x <- data[,-dim(data)[2]]
  y <- data[,dim(data)[2]]
  w <- c(0,0)
  b <- 0
  len <- length(y)
  i <- 1  
  while(i <= len){
    if(y[i] * (x[i,] %*% w + b) <= 0){
    ## update w and b
      w <- w + eta * y[i] * x[i,]
      b <- b + eta * y[i]
      i <- 1 ##important, for traversing every point
    }
    else{
      i <- i + 1 
    }
  }
  return(list(w=w,b=b))
}

data <- matrix(c(3,3,1,4,3,1,1,1,-1),nr=3,byrow=T)
percept(data = data,eta = 1)

最终结果为
$w
[1] 1 1

$b
[1] -3
再换一个数据:

dat <-matrix(c(1,1,-1,.5,.5,-1,4,1,1,3,2,1,1.5,1,-1,2,3,1,4,3,1,2,3.5,1),nc=3,byrow=T)
perceptron <- percept(data=dat,eta=1)
perceptron

最后结果为:
$w
[1] 4 0

$b
[1] -7
我们试着画出它的图形

dat1 <- dat[,1:2]
dat1 <- as.data.frame(dat1)
names(dat1) <- c("x1","x2")
plot(x2~x1,data=dat1,col=ifelse(4*x1-7<=0,"red","blue"),pch=17,bty="l")
abline(v=7/4,lwd=2,lty=2,col="red")

Perceptron
由此可以看出还是不错的,都已经正确划分。

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

输入:线性可分的数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}, T={
(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)},
其中 x i ∈ R n , y i ∈ { + 1 , − 1 } , i = 1 , 2 , ⋯   , N ; x_i\in R^n,y_i \in \{+1,-1\},i=1,2,\cdots,N; xi​∈Rn,yi​∈{
+1,−1},i=
1,2,⋯,N;
学习率 η ( 0 < η ≤ 1 ) ; \eta(0<\eta\le1); η(0<η≤1);
输出: α , b ; \alpha,b; α,b;感知机模型 f ( x ) = s i g n ( ∑ j = 1 N α j y j x j ⋅ x + b ) . f(x)=sign(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b). f(x)=sign(∑j=1N​αj​yj​xj​⋅x+b).
其中 α = ( α 1 , α 2 , ⋯   , α N ) T . \alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T. α=(α1​,α2​,⋯,αN​)T.
(1) α ← 0 , b ← 0 \alpha\leftarrow 0,b\leftarrow0 α←0,b←0
(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi​,yi​)
(3)如果 y i ( ∑ j = 1 N α j y j x j ⋅ x i + b ) ≤ 0 y_i(\sum_{j=1}^N\alpha_jy_jx_j\cdot x_i +b)\le0 yi​(∑j=1N​αj​yj​xj​⋅xi​+b)≤0
α i ← α i + η b ← b + η y i \alpha_i\leftarrow \alpha_i +\eta\\ b\leftarrow b+\eta y_i αi​←αi​+ηb←b+ηyi​
(4)转至(2)直到没有误分类数据。
对偶形式训练实例仅以内积的形式实现,为了方便,可以预先将训练集中的实例间的内积计算出来并以矩阵形式存储,这个矩阵就是所谓的Gram矩阵
G = [ x i ⋅ x j ] N × N G=[x_i\cdot x_j]_{N\times N} G=[xi​⋅xj​]N×N​

3.4 R语言实现(感知机学习算法的对偶形式)

后续补充

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179091.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • window到linux文件名乱码和文件内容乱码解决总结「建议收藏」

    window到linux文件名乱码和文件内容乱码解决总结「建议收藏」    window系统一般文件名编码为gbk,文件内容编码这个需要通过编辑器查看或者设置,找个editplus文本编辑器就可以处理文本内容编码。    那么在window上显示正常的文件到linux上的时候,常常会因为中文问题导致乱码,比如文件名乱码和文件内容乱码。查看linux设置的编码:[root~]# echo$LANGzh_CN.UTF-8[root…

    2022年4月19日
  • Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系

    Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系一、前言在搭建SpringCloud项目环境架构的时候,Springboot版本与SpringCloud版本对应关系很重要,如果版本不对应,常见的会遇见项目启动不起来,怪异的会是项目出现一些诡异的问题。ReleasetrainSpringBootcompatibilitySpringCloudReleaseTrainSpringBootVersionHo…

    2022年6月3日
  • 匹配中文的正则表达式_正则表达式和正规式

    匹配中文的正则表达式_正则表达式和正规式原文链接:http://caibaojian.com/zhongwen-regexp.html这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的。\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下匹配中文字符的正则表达式:[\u4e00-\u9fa5]或许你也需要匹配双字节字符,中文也是双…

    2022年10月27日
  • 汉罗塔编程_c语言斐波那契数列递归算法

    汉罗塔编程_c语言斐波那契数列递归算法汉罗塔C语言算法新手入门(3分钟学会)前言我相信大家在刚接触C语言时对汉罗塔递归算法有些头痛,现在依旧头痛的小朋友不要担心,你只要学完这篇文章,我相信你对汉罗塔算法十分感兴趣的。一看就会,不信试试?具备知识在看这篇文章之前,首先你得学会C语言函数知识点,仅此而已。1.直接上代码#include<stdio.h>intmain(){voidmove(intn,c…

    2022年10月12日
  • PyQuery用法详解

    PyQuery用法详解PyQuery是强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得BeautifulSoup语法太难记,如果你熟悉jQuery的语法那么,PyQuery就是你绝佳的选择。一、初始化方式,有三种,可以传入字符串,传入url,传入文件。字符串初始化html=”’&lt;div&gt;&lt;ul&gt;&lt;liclass="item-…

    2022年4月30日
  • SQL通配符

    SQL通配符通常我们只是用%作为通配符,用来表示任意个字符。但sql中的通配符还有下划线_,用来标识任意一个字符实例SELECT*FROMWebsitesWHEREnameLIKE&#

    2022年7月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号