神经网络算法研究和分析

举报
小康不会AI 发表于 2022/09/14 22:09:23 2022/09/14
【摘要】 神经网络算法研究和分析

神经网络算法研究和分析

对于两类分类问题的研究及其分析。

一类

( 5 , 1 ) , ( 7 , 3 ) , ( 3 , 2 ) , ( 5 , 4 ) (5,1) ,(7,3) ,(3,2) ,(5,4)

二类

( 0 , 0 ) , ( 1 , 3 ) , ( 2 , 3 ) , ( 3 , 0 ) (0,0) ,(-1,-3) ,(-2,3) ,(-3,0)

我们将其画出散点:

x=np.array((5,7,3,5,0,-1,-2,-3))
y=np.array((1,3,2,4,0,-3,3,0))
colors = [ "red", "red", "red", "red", "green", "green", "green", "green"]
plt.scatter(x, y ,c=colors)

image.png

接下来求出重心并画出其连线:

points = [[5., 4.],
         [3., 2.],
         [7., 3.],
         [5., 1.]]
points = np.array(points)
b1 = np.mean(points,axis=0)
points = [[-3., 0.],
         [-2., 3.],
         [-1., -3.],
         [0, 0]]
points = np.array(points)
b2 = np.mean(points,axis=0)
x2 = np.arange(-3,8,0.1)
y2=25/65*x2+1.5*25/65
plt.plot(x2,y2 ,label="centerLIne",linestyle="--")

image.png

根据题干直接画一条垂直的可划分线:

y3=-65/25*x2+2
plt.plot(x2,y3)

image.png

当然这样做全是自己目测出来的,如何利用机器学习,让程序从一条原本错误的曲线学习得到正确的划分呢?

算法核心分析:

1.先写出sgn函数:

def sgn(num):
    if num >= 0:
        return 1
    else:
        return -1

2.完成数据和模型初始化:
由图可知一定可以用线性方程进行划分区域,所以直接假设可划分模型是一个直线:

y = w x + b y=wx+b

初始化:

b = 9 b=-9

w = 5 w=-5

学习率 l e a r n r a t e = 0.05 学习率learnrate=0.05

x=np.array((5,7,3,5,0,-1,-2,-3))
y=np.array((1,3,2,4,0,-3,3,0))
n=np.array((1,1,1,1,-1,-1,-1,-1))
b=-9
w=-5
learnrate=0.05

3.反馈调节函数:

 w = w + ((n[i] - sgn(y[i] - (x[i] * w + b))) * learnrate * x[i])
        b =b+(y[i] - (x[i] * w + b)) * learnrate

开始学习之前错误函数的样子(绿色线条):
image.png
可以看到完全不能分割相应的数据。
学习24次后的曲线和调节结果(绿色线条):
image.png
我们可以发现曲线此时已经完全将两类点数分开,随后为了验证反馈调节的正确性,我将学习频率直接提高到10000次,看是否收敛:
image.png
一万次结果更加完美,所以我们的反馈调节函数是正确的。
下面附上我的全部可编译代码供大家参考。

import matplotlib.pyplot as plt
import  numpy as np
def sgn(num):
    if num >= 0:
        return 1
    else:
        return -1
points = [[5., 4.],
         [3., 2.],
         [7., 3.],
         [5., 1.]]
points = np.array(points)
b1 = np.mean(points,axis=0)
points = [[-3., 0.],
         [-2., 3.],
         [-1., -3.],
         [0, 0]]
points = np.array(points)
b2 = np.mean(points,axis=0)
print(b1,b2)
x2 = np.arange(-3,8,0.1)
y2=25/65*x2+1.5*25/65
plt.plot(x2,y2 ,label="centerLIne",linestyle="--")
y3=-65/25*x2+2
plt.plot(x2,y3)
x=np.array((5,7,3,5,0,-1,-2,-3,b1[0],b2[0]))
y=np.array((1,3,2,4,0,-3,3,0,b1[1],b2[1]))
colors = [ "red", "red", "red", "red", "green", "green", "green", "green", "black", "black"]
plt.scatter(x, y ,c=colors)
x=np.array((5,7,3,5,0,-1,-2,-3))
y=np.array((1,3,2,4,0,-3,3,0))
n=np.array((1,1,1,1,-1,-1,-1,-1))
b=-9
w=-5
learnrate=0.05
for k in range(10000):
    wori=w
    bori=b
    for i in range(8):
        w = w + ((n[i] - sgn(y[i] - (x[i] * w + b))) * learnrate * x[i])
        b =b+(y[i] - (x[i] * w + b)) * learnrate
        print(w,b)
y4= w*x2+b
print(w,b)
plt.plot(x2,y4)
plt.ylim(-6,8)
plt.xlim(-6,8)
plt.legend()
plt.show()
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。