文章目录

  • 写在前面
  • 批感知器算法
  • Ho Kashyap算法
  • MSE多类扩展方法
  • Ref.

写在前面

本博客为模式识别作业的记录,实现批感知器算法、Ho Kashyap算法和MSE多类扩展方法,可参考教材[1]\color{#0000FF}{[1]}[1]。所用数据如下如所示:

批感知器算法

从a=0\mathbf a=0a=0开始迭代,分类ω1\omega_1ω1​和ω2\omega_2ω2​并计算最终的解向量,记录下收敛的步数。

"""批感知器算法"""import matplotlib.pyplot as plt
import numpy as np
import mathdata = np.loadtxt('data.txt')
trn_data1 = data[0:20, 0:2]   # 问题一(1)
trn_lable1 = data[0:20, 2]# trn_data1 = data[10:30, 0:2]   # 问题一(1)
# trn_lable1 = data[10:30, 2]plt.scatter(trn_data1[0:10, 0], trn_data1[0:10, 1], color='blue', marker='o', label=''r'$\omega_1$')
plt.scatter(trn_data1[10:20, 0], trn_data1[10:20, 1], color='red', marker='x', label=''r'$\omega_2$')
plt.xlabel(''r'$x_1$')
plt.ylabel(''r'$x_2$')
plt.legend(loc='upper left')
plt.title('Original Data')
plt.show()X = np.hstack((np.ones((trn_data1.shape[0], 1)), trn_data1))X1 = X[0:10, :]
X2 = -1 * X[10:20, :]
X = np.vstack((X1, X2))   # 规范化增广样本
w = np.zeros((3, 1), dtype='float32')step = 0
for i in range(100):if i == 0:y_pred = np.where(np.dot(X, w) == 0)[0]  # 统计分类错误的点数else:y_pred = np.where(np.dot(X, w) < 0)[0]step += 1print('第%2d次更新,分类错误的点个数:%2d' % (step, len(y_pred)))if len(y_pred) > 0:w += (np.sum(X[y_pred, :], axis=0)).reshape((3, 1))else:breakprint('解向量为:', w)
x1 = np.array([-5, 8])
x2 = -1 * (w[1]*x1 + w[0])/w[2]plt.scatter(trn_data1[0:10, 0], trn_data1[0:10, 1], color='blue', marker='o', label=''r'$\omega_1$')
plt.scatter(trn_data1[10:20, 0], trn_data1[10:20, 1], color='red', marker='x', label=''r'$\omega_2$')
plt.plot([x1[0], x1[1]], [x2[0], x2[1]], 'black')
plt.xlabel(''r'$x_1$')
plt.ylabel(''r'$x_2$')
plt.legend(loc='upper left')
plt.title('classified Data')
plt.show()

算法在第24次更新收敛,此时解向量a=(34.0,−30.4,34.1)\mathbf{a} = (34.0,−30.4, 34.1)a=(34.0,−30.4,34.1)

Ho Kashyap算法

"""Ho Kashyap算法"""import matplotlib.pyplot as plt
import numpy as np
import mathdata = np.loadtxt('data.txt')
trn_data1 = data[0:10, 0:2]   # 问题二(1)
trn_lable1 = data[0:10, 2]
temp = data[20:30, 0:2]
temp_lb = data[20:30, 2]# trn_data1 = data[10:20, 0:2]   # 问题二(2)
# trn_lable1 = data[10:20, 2]
# temp = data[30:40, 0:2]
# temp_lb = data[30:40, 2]trn_data = np.vstack((trn_data1, temp))
trn_lable = np.vstack((trn_lable1, temp_lb))# print(trn_data.shape, '\n', trn_lable.shape)
# print(trn_data)plt.scatter(trn_data[0:10, 0], trn_data[0:10, 1], color='blue', marker='o', label=''r'$\omega_2$')
plt.scatter(trn_data[10:20, 0], trn_data[10:20, 1], color='red', marker='x', label=''r'$\omega_4$')
plt.xlabel(''r'$x_1$')
plt.ylabel(''r'$x_2$')
plt.legend(loc='upper left')
plt.title('Original Data')
plt.show()X = np.hstack((np.ones((trn_data.shape[0], 1)), trn_data))
X1 = X[0:10, :]
X2 = -1 * X[10:20, :]
X = np.vstack((X1, X2))   # 规范化增广样本
w = np.random.randn(3, 1)
b = np.random.rand(X.shape[0], 1)
eta = 0.1
MAX_iteration = 1000step = 0
acc = 0
for i in range(MAX_iteration):e = np.dot(X, w) - be_p = 0.5 * (e + abs(e))eta_k = eta/(i+1)# if (e == 0).all():if max(abs(e)) <= min(b):print(e)breakelse:b += 2 * eta_k * e_pY_p = np.linalg.pinv(X)w = np.dot(Y_p, b)step += 1acc = (np.sum(np.dot(X, w) > 0)) / X.shape[0]print('第%2d次更新, 分类准确率%f' % (step, acc))# print(e, '\n')if step == MAX_iteration and acc != 1:print("未找到解,线性不可分!")x1 = np.array([-8, 8])
x2 = -1 * (w[1]*x1 + w[0])/w[2]
plt.scatter(trn_data[0:10, 0], trn_data[0:10, 1], color='blue', marker='o', label=''r'$\omega_2$')
plt.scatter(trn_data[10:20, 0], trn_data[10:20, 1], color='red', marker='x', label=''r'$\omega_4$')
plt.plot([x1[0], x1[1]], [x2[0], x2[1]], 'black')
plt.xlabel(''r'$x_1$')
plt.ylabel(''r'$x_2$')
plt.text(3, -2, 'Accuracy: %.3f' % acc)
plt.legend(loc='upper left')
plt.title('classified Data')
plt.show()

MSE多类扩展方法

首先根据训练样本计算出权值W,然后根据此权值和测试样本计算出预测值,并对该值取argmax 得到最终的输出标签,从而得到分类正确率为100%。

"""MSE多类扩展方法"""import numpy as npdata = np.loadtxt('data.txt')
train_data = []
train_label = []
test_data = []
test_label = []# 数据预处理
for i in [0, 10, 20, 30]:temp_data = data[i:i+8, 0:2]temp_label = data[i:i+8, 2]train_data.append(temp_data)train_label.append(temp_label)test_data.append(data[i+8:i+10, 0:2])test_label.append(data[i+8:i+10, 2])train_data = np.array(train_data).reshape((32, 2))
train_label = np.array(train_label).reshape(-1).astype(int) - 1
test_data = np.array(test_data).reshape((8, 2))
test_label = np.array(test_label).reshape(-1).astype(int) - 1train_label = np.eye(4)[train_label]      # 32x4大小,one-hot向量矩阵
test_label = np.eye(4)[test_label]        # 8x4大小train_data = np.hstack((train_data, np.ones((train_data.shape[0], 1))))
test_data = np.hstack((test_data, np.ones((test_data.shape[0], 1))))print(train_data.shape, train_label.shape)
print(test_data.shape, test_label.shape)train_data = train_data.T     # 按照课件的公式调整数据维度
train_label = train_label.T
test_data = test_data.T
test_label = test_label.Tprint(train_data.shape, train_label.shape)
print(test_data.shape, test_label.shape)lam = 1e-9
temp = np.linalg.inv(np.dot(train_data, train_data.T) + lam)
W = np.dot(np.dot(temp, train_data), train_label.T)   # 3x4维y_pred = np.dot(W.T, test_data)
index = np.argmax(y_pred, axis=0)   # 得到每个样本对应类别的值最大的索引
y_pred = np.eye(y_pred.shape[0])[index].T   # 转换为one-hot向量wrong_num = sum(sum(y_pred - test_label))
acc = (1 - wrong_num / len(test_label)) * 100
print('分类正确率为:%.2f%% ' % acc)

Ref.

[1]Richard O. Duda. 模式分类[M]. 李宏东等译. 机械工业出版社 中信出版社, 2003.

线性判别函数(Python实现批感知器算法、Ho Kashyap算法和MSE多类扩展方法)——模式识别编程作业相关推荐

  1. mooc程序设计与算法(三)C++面向对象程序设计 类和对象提高 编程作业 5:魔兽世界之一:备战

    5:魔兽世界之一:备战 这道题是典型的,看了题目不想做题系列... 题目太长,看了,看不懂....后来,上网找了某博客中据说是老师的代码,研究了一下,觉得真的,c++面向对象编程还是很深奥的....下 ...

  2. 人工神经网络—感知器算法

    感知器算法 1. 回顾 2. 感知器算法 2.1 感知器算法的实现步骤 2.2 算法能停得下来吗? 2.3 基于增广向量的感知器算法 2.4 感知器算法收敛定理 3. 感知器算法收敛的MATLAB程序 ...

  3. 感知器算法原理详解及python实现

    感知器算法PLA 感知器算法是对一种分类学习机模型的称呼,属于有关机器学习的仿生学领域中的问题,由于无法实现非线性分类而下马.但"赏罚概念(reward-punishment concept ...

  4. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  5. 感知器算法及python实现

    这边建议异步到第二版感知器算法及其python 实现 V2.0,训练速度更快,数据集更直观. 第一版写的还是太过粗糙. 感知器算法及python实现 通俗来讲,感知器算法可以完成如下这类线性可分的二分 ...

  6. 感知器算法python代码实现

    1.题目 2.数学求解过程 该轮迭代分类结果全部正确,判别函数为g(x)=-2x1+1 3.感知器算法原理及步骤 4.python代码实现及结果 (1)由数学求解过程可知: (2)程序运行结果 (3) ...

  7. python实现感知器算法

    在1943年,沃伦麦卡洛可与沃尔特皮茨提出了第一个脑神经元的抽象模型,简称麦卡洛可-皮茨神经元(McCullock-Pitts neuron)简称MCP,大脑神经元的结构如下图.麦卡洛可和皮茨将神经细 ...

  8. 感知器算法例题ppt_感知器算法.ppt

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp数据结构与算法 感知器算法.ppt14页 本文档一共被下载:次, ...

  9. 感知器算法例题ppt_感知器的训练算法

    1.感知器算法来源和基本思想 "感知器"一词出自于20世纪50年代中期到60年代中期人们对一种分类学习机模型的称呼,它是属于有关动物和机器学习的仿生学领域中的问题.当时的一些研究者 ...

最新文章

  1. 利用反射及ActionFilterAttribute实现MVC权限管理
  2. 境外 java 中文乱码_Java前后端交互中文出现乱码??
  3. 关于SVN 目录结构
  4. Windows CE下流驱动的动态加载
  5. php 检测死锁,MySQL 死锁检测
  6. golang windows环境下的配置安装
  7. NodeJS 加密 —— crypto 模块
  8. java中使用unzip_unzip命令_Linux unzip命令用法示例详解
  9. 高斯求积分公式matlab,matlab高斯积分公式
  10. 手机群控还有这种事半功倍的操作?快来看强大的Rest API脚本功能
  11. c语言斐波那契数列_母函数——斐波那契数列通项公式
  12. 导数与微分及简单例题
  13. 如何从Google Play下载应用到电脑
  14. 竞品分析:小宇宙APP——如何在播客领域站住脚?
  15. 发改委印发三年行动计划 智能机器人有望成为下一片蓝海
  16. 手机红米5android7.11,这些是不支持ANDROID 11更新的小米和红米手机
  17. 计算机与汽车智能信息化管理,谈计算机控制系统在汽车行业的应用
  18. 学习难度最高的五大编程语言,Java排第3,Python竟然都不能上榜
  19. 网站长尾关键词怎么布局 提升搜索排名
  20. MyBatisPlus--多数据源

热门文章

  1. 【生产排故】oracle11g升19c之ORA-00904 WM_CONCAT invalid identifie排故
  2. FatMouse's Speed
  3. photoshop顶尖设计大师(一)
  4. Android 内存优化总结实践
  5. 影响亚马逊cpc站内广告的排名因素主要有哪些呢?值得你一看!
  6. 【百度实习录】新人练习
  7. 入网模组 | 广和通G510无线GPRS模块接入方案
  8. 【软件测试】Oracle中scott用户的emp、dept、bonus、salgrade建表代码与数据
  9. 追风去,不如造风来——致敬蚂蚁区块链创新大赛中的参与者们
  10. mysql插入数据变慢的原因_mysql插入数据变慢的原因