感知器(Perceptron)数据分类算法


  • 基本原理
  • 步调函数与阈值
  • 权重更新算法
  • 阈值的更新
  • 感知器算法使用范围
  • 机器学习-简单实现神经网络感知器分类算法部分代码
  • 参考与引用
一、基本原理

权重向量W,训练样本X

1. 把权重向量初始化为0,或把每个分量初始化为[0, 1]间任意小数
2. 把训练样本输入感知器,得到分类结果(-1或1)
3. 根据分类结果更新权重向量

二、步调函数与阈值

w0 = -θ(w0为阈值) and x0 = 1
z = w0x0+w1x1+...+wmxm=wTx and Φ(z) = 1 , if z ≥ θ; -1, otherwise;

三、权重更新算法

权重更新算法.png

其中x(j)是传入的对应样本,学习率需要人为调整


权重更新算法演示.png

w(0)为w第一个分量

四、阈值的更新

阈值的更新.png
五、感知器算法使用范围

  • Linearly separable
六、机器学习-简单实现神经网络感知器分类算法部分代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as pt
from matplotlib.colors import ListedColormap


class Perceptron(object):
    """
    eta:学习率
    n_iter:权重向量的训练次数
    w_:神经分叉权重向量
    errors:用于记录神经元判断出错次数
    """

    def __init__(self, eta=0.01, n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
        pass

    def fit(self, X, y):
        """
        输入训练数据,培训神经元,x输入样本向量,y对应样本分类

        X:shape[n_samples, n_features]
        X:[[1, 2, 3], [4, 5, 6]]
        n_samples:2
        n_features:3

        y:[1, -1]
        """

        """
        初始化权重向量为0
        +1是因为前面算法提到的w0,也就是步调函数的阈值
        """
        self.w_ = np.zeros(X.shape[1] + 1)
        self.errors_ = []

        """
        同一数据训练n_iter次得到训练好了的感知器
        """
        for _ in range(self.n_iter):
            errors = 0
            """
            X:[[1, 2, 3], [4, 5, 6]]
            y:[1, -1]
            zip(X, y) = [([1, 2, 3], 1), ([4, 5, 6], -1)]
            """
            for xi, target in zip(X, y):
                """
                xi、target分别对对应的X行及y行
                """
                # print(xi)
                # print(target)
                """
                update = η * (y - y')
                """
                update = self.eta * (target - self.predict(xi))

                """
                xi 是一个向量
                update * xi 等价
                ▽W(1) = X[1]*update, ▽W(2) = X[2]*update, ▽W(3) = X[3]*update
                    
                w_[1:]从第一个开始忽略了第0个(阈值)到最后一个
                """
                self.w_[1:] += update * xi
                self.w_[0] += update    # 阈值的更新

                errors += int(update != 0.0)    # 统计错误次数
                self.errors_.append(errors)
                pass
            pass
        pass

    def net_input(self, X):
        """
        z = W0*1 + W1*X1 + ...+ Wn*Xn
        """
        return np.dot(X, self.w_[1:]) + self.w_[0]
        pass

    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, -1)
        pass

    pass


file = 'test.csv'

df = pd.read_csv(file, header=None)

df.head(10)

# df.to_csv('test.csv', index=False, header=None)

"""
将第4列单独抽取出来赋给y
"""
y = df.loc[0:99, 4].values

"""
y == 'Iris-setosa'时改为1,否则改为-1
"""
y = np.where(y == 'Iris-setosa', -1, 1)

"""
抽取0到100行第0列和第2列数据赋给X
"""
X = df.iloc[0:100, [0, 2]].values

pt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
pt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
pt.xlabel('Petal-length')
pt.ylabel('FlowerDiameter-length')
pt.legend(loc='upper left')  # 将label放在左上角
# pt.show()
# print(X)

ppn = Perceptron(eta=0.1, n_iter=10)  # 创建一个学习率为0.1,权重向量训练次数为10的感知器
print('Here are X:')
print(X)
print(y)
ppn.fit(X, y)  # 将X, y传入感知器进行训练
pt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')    # ???
pt.xlabel('Epochs')     # Epoch训练次数
pt.ylabel('Fail ClasifierNumber')
pt.show()


def plot_decision_regions(X, y, classifier, resolution=0.02):
    marker = ('s', 'x', 'o', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    """
    根据向量y中不同不同元素的种类分配不同的颜色
    y 由01构成,有两种不同的元素,len(np.unique(y))为2
    """
    cmap = ListedColormap(colors[:len(np.unique(y))])

    """
    获取两列数据中的最小值、最大值
    """
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max()
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max()

    print(x1_min, x1_max)
    print(x2_min, x2_max)

    """
    meshgrid()通过x1_min, x1_max, resolution的值来
    构造一个向量,然后再将该向量扩展成一个二维矩阵
    """
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))

    """
    np.arange()从x1_min开始到x1_max(不包含)结束,等差resolution生成单维向量
    """
    # print(np.arange(x1_min, x1_max, resolution).shape)
    # print(np.arange(x2_min, x2_max, resolution))
    """
    第一个向量参数向下扩展第二个向量参数行,第二个向量参数向右扩展第一个向量参数列
    """
    # print(xx1.shape)
    # print(xx1)
    # print(xx2.shape)
    # print(xx2)

    """
    ravel()函数将扩张后的二维向量还原回扩张前的单位向量
    """
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    print(xx1.ravel())
    print(xx2.ravel())
    """
    xx1.ravel()、xx2.ravel()对应列数据组合得到Z中对应列结果
    """
    print(Z)

    Z = Z.reshape(xx1.shape)
    # print('xx1.shape:')
    # print(xx1.shape)
    # print('Z.shape:')
    # print(Z.shape)
    # print(Z)
    """
    countourf()根据给的数据绘制数据间的分界线
    """
    pt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)  # alpha为透明度
    """
    x、y坐标轴起始和结束点分别对应xx1、xx2最小最大值
    """
    pt.xlim(xx1.min(), xx1.max())
    pt.ylim(xx2.min(), xx2.max())

    for idx, cl in enumerate(np.unique(y)):  # 绘制区域打上标签说明
        pt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx),
                   marker=marker[idx], label=cl)


"""
plot_decision_regions()传入训练好的感知器并模拟数据进行分类
"""
plot_decision_regions(X, y, ppn, resolution=0.02)
pt.xlabel('Petal Length')
pt.ylabel('Flower Diameter Length')
pt.legend(loc='upper left')
pt.show()

七、参考与引用

慕课网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 注:题中所指的『机器学习』不包括『深度学习』。本篇文章以理论推导为主,不涉及代码实现。 前些日子定下了未来三年左右...
    我偏笑_NSNirvana阅读 39,951评论 12 145
  • 这个题目取得比较奇怪,原因是:虽然号称数学是世界上最简洁的语言,但是太多的公式难免看的人心慌;其次公式在hexo+...
    Helen_Cat阅读 2,635评论 0 13
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,896评论 2 64
  • 机器学习是做NLP和计算机视觉这类应用算法的基础,虽然现在深度学习模型大行其道,但是懂一些传统算法的原理和它们之间...
    在河之简阅读 20,494评论 4 65
  • 目光回敛 思忆变得悠远 时间, 它不知思念 漫步羊肠 曾,轻盈留欢 今,颠沛不安 是遇见 是愁现 不知,不知 门庭...
    啊树崽阅读 156评论 0 1