栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

感知器算法实现(实例)step by step

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

感知器算法实现(实例)step by step


如果要将上图用一条直线分开,用感知器算法如何实现:

import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
from sklearn.model_selection import train_test_split
import graphviz
import matplotlib.pyplot as plt


def sgn(x):
    if (x >= 0):
        return 1
    if (x < 0):
        return -1


d = np.array(
    [[1.0, 1.0, 1.0, 1.0], [1.0, 2.0, 1.0, 1.0], [2.0, 1.0, 1.0, 1.0], [3.0, -4.0, 1.0, 1.0], [-0.0, -1.0, 1.0, 1.0],
     [-1.0, -0.0, 1.0, 1.0],
    [-1.0, -2.0, 1.0, -1.0], [-2.0, -3.0, 1.0, -1.0],
    [-3.0, -1.0, 1.0, -1.0], [-3.0, -2.0, 1.0, -1.0], [-2.0, 2.0, 1.0, -1.0]])
w = np.array([0.0, 0.0, 2.0])



plt.scatter(d[:7, 0], d[:7, 1], c='black', marker='x')
plt.scatter(d[7: np.size(d, 0)+ 1, 0], d[7:np.size(d, 0) + 1, 1], c='black')
plt.axis([-7, 6, -7, 10])
plt.show()

restart = True
while restart:
    for i in range(np.size(d, 0)):
        if (sgn(w[0] * d[i, 0] + w[1] * d[i, 1] + w[2] * d[i, 2]) == d[i, 3]):

            x = np.arange(-10, 11)

            if (i < 7):
                plt.scatter(d[:i, 0], d[:i, 1], c='black', marker='x')
            else:
                plt.scatter(d[:6, 0], d[:6, 1], c='black', marker='x')
                plt.scatter(d[6:i + 1, 0], d[6:i + 1, 1], c='black')
            if w[1] == 0:
                if (w[0] == 0):
                    plt.vlines(-1 * w[2], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
                else:
                    plt.vlines(-1 * w[2] / w[0], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
            else:
                y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
                plt.plot(x, y)
                plt.axis([-7, 6, -7, 10])
                plt.show()


        else:
            x = np.arange(-10, 11)
            if (i < 5):
                plt.scatter(d[:i, 0], d[:i, 1], c='black', marker='x')
            if (i >= 5):
                plt.scatter(d[:5, 0], d[:5, 1], c='black', marker='x')
                plt.scatter(d[5:i + 1, 0], d[5:i + 1, 1], c='black')
            if w[1] == 0:
                if (w[0] == 0):
                    plt.vlines(-1 * w[2], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
                else:
                    plt.vlines(-1 * w[2] / w[0], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
            else:
                y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
                plt.plot(x, y)
                plt.axis([-7, 6, -7, 10])
                plt.show()

            w[0] = w[0] + d[i, 3] * d[i, 0] * 0.1
            w[1] = w[1] + d[i, 3] * d[i, 1] * 0.1
            print(w)
            if w[1] == 0:
                if (w[0] == 0):
                    plt.vlines(-1 * w[2], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
                else:
                    plt.vlines(-1 * w[2] / w[0], -7, 10)
                    plt.axis([-7, 6, -7, 10])
                    plt.show()
            else:
                y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
                plt.plot(x, y)
                plt.axis([-7, 6, -7, 10])
                plt.show()

            print(i, end=' ')
            print(w[0])
            break
    if (i == 8):
        break

print()

print(w)

plt.scatter(d[:6, 0], d[:6, 1], c='black', marker='x')
plt.scatter(d[6:np.size(d, 0), 0], d[6:np.size(d, 0), 1], c='black')
x = np.arange(-10, 11)
if (w[1] != 0):
    y = (-1 * w[2] * d[i, 2] - w[0] * x) / w[1]
    plt.plot(x, y)
    plt.axis([-7, 6, -7, 10])
    plt.show()
else:
    plt.vlines(-1 * w[2] / w[0], -7, 10)
    plt.axis([-7, 6, -7, 10])
    plt.show()

代码写的很乱,刚用python,感兴趣的用pycharm跑着玩玩

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/344422.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号