码迷,mamicode.com
首页 > 编程语言 > 详细

【ML-8】感知机算法-传统和对偶形式

时间:2020-02-23 23:55:25      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:RKE   没有   直线   微软雅黑   round   back   ima   while   for   

目录

  1. 感知机模型
  2. 感知机模型损失函数
  3. 感知机模型损失函数的优化方法
  4. 感知机模型的算法
  5. 感知机模型的算法对偶形式

我们知道较早的分类模型——感知机(1957年)是二类分类的线性分类模型,也是后来神经网络和支持向量机的基础。

1、感知机模型

感知机模型是一种二分类的线性分类器,只能处理线性可分的问题,感知机的模型就是尝试找到一个超平面将数据集分开,在二维空间这个超平面就是一条直线,在三维空间就是一个平面。

技术图片

2. 感知机模型损失函数

技术图片

这样我们就得到了初步的感知机模型的损失函数。

我们研究可以发现,分子和分母都含有θ,当分子的θ扩大N倍时,分母的L2范数也会扩大N倍。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为1,然后求另一个即分子自己或者分母的倒数的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型中,我们采用的是保留分子,即最终感知机模型的损失函数简化为:

技术图片

3. 感知机模型损失函数的优化方法

技术图片

4. 感知机模型的算法

技术图片

5. 感知机模型的算法对偶形式

技术图片

技术图片

转自:https://www.cnblogs.com/pinard/p/6042320.html

感知机算法传统方式实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

import numpy as np

from matplotlib import pyplot as plt

x=np.array([[1,1],[3,3],[4,3]])

y=np.array([[-1],[1],[1]])

w=[0,0]

b=0

?

def Train(x,y,w,b):

length = x.shape[0]

j=0

while True:

count=0

for i in range(length):

print("迭代次数为:%d w=[%d,%d] b=%d"%(j,w[0],w[1],b))

if y[i]*(np.dot(w,x[i])+b)<=0: #未被正确分类

#更新w,b

w=w+y[i]*x[i]

b=b+y[i]

count+=1

j+=1

if count==0:

f="f(x)=sign(%d*x+%d*x+%d)"%(w[0],w[1],b)

print("感知机模型为:%s"%f)

return w,b,f

w,b,f=Train(x,y,w,b)

?

#画分离超平面图

def fun(x):

y=(-b-w[0]*x)/w[1]

return y

x_data=np.linspace(0,5)

y_data=fun(x_data)

plt.plot(x_data,y_data,color=‘r‘)

plt.title("perceptron")

?

#画散点图

for i in range(x.shape[0]):

if y[i] < 0:

plt.scatter(x[i][0], x[i][1], marker=‘x‘,s=50)

else:

plt.scatter(x[i][0], x[i][1])

plt.show()

技术图片

感知机算法的对偶形式

感知机的对偶形式与原始形式并没有多大的区别,运算的过程都是一样的,但通过对偶形式会事先计算好一些步骤的结果并存储到Gray矩阵中,因此可以加快一些运算速度,数据越多节省的计算次数就越多,因此比原始形式更加的优化

import numpy as np

import matplotlib.pyplot as plt

x = np.array([[3, 3], [4, 3], [1, 1]])

y = np.array([[1], [1], [-1]])

?

# 创建gram矩阵

z = np.transpose(x)

m = np.dot(x,z)

print("构建的Gram矩阵为:\n",m)

print("-------------------------")

a = np.zeros((x.shape[0], 1))

b = 0

?

def train(x,y,m,a,b):

length = x.shape[0]

while True:

count = 0

for i in range(length):

n = np.dot(m[i], a * y ) + b

if n* y[i] <= 0:

a[i] = a[i] + 1

b = b + y[i]

count += 1

if count == 0:

w = np.sum(x * a* y, axis=0)

print(w,b)

print("感知机模型:\nf(x) = sign(%dx+%dy+(%d))\n"%(w[0],w[1],b))

return w,b

w,b = train(x,y,m,a,b)

?

def fun(x):

y = (-b -w[0] * x) / w[1]

return y

x_data = np.linspace(0, 5, 100) # 创建等差数组

y_data = fun(x_data)

plt.plot(x_data, y_data, color=‘r‘, label=‘y1 data‘)

for i in range(x.shape[0]):

?

if y[i] < 0:

plt.scatter(x[i][0], x[i][1], marker=‘x‘, s=50)

else:

plt.scatter(x[i][0], x[i][1], s=50)

plt.show()

技术图片

? ?

? ?

? ?

? ?

? ?

? ?

? ?

? ?

【ML-8】感知机算法-传统和对偶形式

标签:RKE   没有   直线   微软雅黑   round   back   ima   while   for   

原文地址:https://www.cnblogs.com/yifanrensheng/p/12354924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!