实现KNN算法&搭建人工神经网络ANN——第三次数据挖掘实验

2023-11-09

实验结果直接戳这里免费下载实验报告
(决策树算法的实验还没做 做了之后再上传吧 最近有点忙555)

1.KNN算法

即最邻近结点算法 / K均值聚类算法

1.1 KNN算法原理:

KNN属于lazy learning —— 不会对训练样本数据进行学习
对一个新数据 计算它与训练集中数据的距离 选择最短的k个作为邻居 然后预测新数据的类别和k个邻居中一致性最多的所属类别。

1.2 KNN算法的优点

  • 经典算法,简单、快速。
  • 处理大数据集,该算法是相对可伸缩和高效率的。

有新数据不用重新聚类了~所以是相对可伸缩的

1.3 KNN算法的缺点

  • 必须事先给出k
  • 对初始值敏感

不同初始值可能导致不同的结果

  • 对于噪声数据和孤立点数据是敏感的
  • 要求训练样本正确体现数据的真实分布

由于KNN的预测效果是强依赖于训练数据的,所以KNN不会对训练数据进行深入学习,只是单纯地考虑数据之间的距离。

所以一旦训练样本不能正确体现数据真实分布,预测就会不准确!

另外,训练数据如果不属于同一分布,也会导致预测不准确。

1.4 KNN的做法(目的):

预测新数据的类别和k个邻居中一致性最多的所属类别。

1.5 编程实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


class KNearestNeighbor(object):
    def __init__(self):
        pass

    def loadData(self, path):
        data = pd.read_csv(path, header=None)
        data.columns = ['sepal length', 'sepal width',
                        'petal length', 'petal width',
                        'species'] # 特征及类别名称
        X = data.iloc[0:150, 0:4].values
        y = data.iloc[0:150, 4].values

        # Iris-setosa 输出label用0表示
        y[y == 'Iris-setosa'] = 0
        # Iris-versicolor 输出label用1表示
        y[y == 'Iris-versicolor'] = 1
        # Iris-virginica 输出label用2表示
        y[y == 'Iris-virginica'] = 2

        # Iris - setosa 4个特征
        self.X_setosa, self.y_setosa = X[0:50], y[0:50]
        # Iris-versicolor 4个特征
        self.X_versicolor, self.y_versicolor = X[50:100], y[50:100]
        # Iris-virginica 4个特征
        self.X_virginica, self.y_virginica = X[100:150], y[100:150]
        # 训练集
        self.X_setosa_train = self.X_setosa[:30, :]
        self.y_setosa_train = self.y_setosa[:30]
        self.X_versicolor_train = self.X_versicolor[:30, :]
        self.y_versicolor_train = self.y_versicolor[:30]
        self.X_virginica_train = self.X_virginica[:30, :]
        self.y_virginica_train = self.y_virginica[:30]
        self.X_train = np.vstack([self.X_setosa_train, self.X_versicolor_train, self.X_virginica_train])
        self.y_train = np.hstack([self.y_setosa_train, self.y_versicolor_train, self.y_virginica_train])

        # 测试集
        self.X_setosa_test = self.X_setosa[30:50, :]
        self.y_setosa_test = self.y_setosa[30:50]
        self.X_versicolor_test = self.X_versicolor[30:50, :]
        self.y_versicolor_test = self.y_versicolor[30:50]
        self.X_virginica_test = self.X_virginica[30:50, :]
        self.y_virginica_test = self.y_virginica[30:50]
        self.X_test = np.vstack([self.X_setosa_test, self.X_versicolor_test, self.X_virginica_test])
        self.y_test = np.hstack([self.y_setosa_test, self.y_versicolor_test, self.y_virginica_test])


        # 利用matplotlib包中的函数 展示数据
    def showData(self):
        # 只选择sepal length和petal length两个特征,在二维平面上作图

        # 训练集
        plt.scatter(self.X_setosa_train[:, 0], self.X_setosa_train[:, 2], color='red', marker='o', label='setosa_train')
        plt.scatter(self.X_versicolor_train[:, 0], self.X_versicolor_train[:, 2], color='blue', marker='^',
                    label='versicolor_train')
        plt.scatter(self.X_virginica_train[:, 0], self.X_virginica_train[:, 2], color='green', marker='s',
                    label='virginica_train')
        # 测试集
        plt.scatter(self.X_setosa_test[:, 0], self.X_setosa_test[:, 2], color='y', marker='o', label='setosa_test')
        plt.scatter(self.X_versicolor_test[:, 0], self.X_versicolor_test[:, 2], color='y', marker='^',
                    label='versicolor_test')
        plt.scatter(self.X_virginica_test[:, 0], self.X_virginica_test[:, 2], color='y', marker='s',
                    label='virginica_test')

        plt.xlabel('sepal length')
        plt.ylabel('petal length')
        plt.legend(loc=4)
        plt.show()

    # 预测函数
    def predict(self, X, k=1):
        # 计算欧氏距离
        num_test = X.shape[0]
        # because(X - X_train)*(X- X_train) = -2X*X_train + X_train,so
        d1 = -2 * np.dot(X, self.X_train.T)
        # shape (num_test,1)
        d2 = np.sum(np.square(X), axis=1, keepdims=True)
        d3 = np.sum(np.square(self.X_train), axis=1)
        dist = np.sqrt(d1 + d2 + d3)
        # 根据k值,选择最可能属于的类别
        y_pred = np.zeros(num_test)
        for i in range(num_test):
            dist_k_min = np.argsort(dist[i])[:k]  # 最近邻k个实例位置
            y_kclose = self.y_train[dist_k_min]  # 最近k个实例对应的标签
            # 找出k个标签中从属类别最多的作为预测类别
            y_pred[i] = np.argmax(np.bincount(y_kclose.tolist()))
            return y_pred


if __name__ == "__main__":
    path = "iris.txt"
    knn = KNearestNeighbor()
    knn.loadData(path)
    knn.showData()
    print(knn.X_train)
    for k in range(1, 11):
        y_pred = knn.predict(X=knn.X_test, k=k)
        accuracy = np.mean(y_pred == knn.y_test)
        print(f'k={k}时,测试集预测准确率:{accuracy}')

2.搭建人工神经网络

2.1 基础知识

利用python实现人工神经网络ANN,包括感知机和后向传播网络(利用BP算法)
这里分别写了两篇文章进行学习&总结:
感知机
在这里插入图片描述

反向传播算法(这个写的真的超级详尽)
在这里插入图片描述

2.2 实验代码

import numpy as np
import matplotlib.pyplot as plt

# 感知机
# 从数据集文件中加载数据
data_set = []  # 数据集
data_label = []  # 数据标签
file = open('ann_Perceptron.txt')
for line in file:
    line = line.split(' ')
    for i in range(len(line)):
        line[i] = float(line[i])
    data_set.append(line[0:2])
    data_label.append(int(line[-1]))
file.close()

data = np.array(data_set)
label = np.array(data_label)
# 初始化w b alpha
w = np.array([0, 0])
b = 0
alpha = 1
# 计算 y*(w*x+b)
f = (np.dot(data, w.T) + b) * label
idx = np.where(f <= 0)

# 使用随机梯度下降法训练模型 求解w b
iteration = 1
while f[idx].size != 0:
    point = np.random.randint((f[idx].shape[0]))
    x = data[idx[0][point]]
    y = label[idx[0][point]]
    w = w + alpha * y * x
    b = b + alpha * y
    print('Iteration:%d w:%s b:%s' % (iteration, w, b))
    f = (np.dot(data, w.T) + b) * label
    idx = np.where(f <= 0)
    iteration = iteration + 1

# 绘图显示
x1 = np.arange(0, 6, 0.1)
x2 = (w[0] * x1 + b) / (-w[1])
idx_p = np.where(label == 1)
idx_n = np.where(label != 1)
data_p = data[idx_p]
data_n = data[idx_n]
plt.scatter(data_p[:, 0], data_p[:, 1], color='red')
plt.scatter(data_n[:, 0], data_n[:, 1], color='blue')
plt.plot(x1, x2)
plt.show()
print('\nPerceptron learning algorithm is over')


# BP网络
def BP(x, y, num):
    epochs = 20000 #定义迭代次数
    learning_rate = 0.3

    I_num = x.shape[0]
    H_num = num
    O_num = y.shape[0]

    V = np.random.rand(I_num, H_num) - 0.5
    dV = np.random.rand(I_num, H_num)

    W = np.random.rand(H_num, O_num) - 0.5
    dW = np.random.rand(H_num, O_num)

    mse_record = np.ones((1, epochs))
    # 前向传播
    for step in range(epochs):
        H_in = np.dot(x, V) # 1 x H_num
        H_out = sigmoid(H_in) # 1 x H_num
        O_in = np.dot(H_out, W) # 1 x 0_num
        O_out = O_in # 1 x 0_num

        error = (O_out - y) # 1 x 0_num
        mse = np.average(np.square(error))
        mse_record[0, step] = mse

        if mse < 4e-4:
            break

        # 反向传播
        # 减去误差 更新w
        for h in range(H_num):
            for j in range(O_num):
                # W偏导
                dW[h, j] = (y[j] - O_out[j]) * H_out[h]

        # 更新V
        for i in range(I_num):
            for h in range(H_num):
                sum = 0
                for j in range(O_num):
                    sum = sum + (y[j] - O_out[j]) * O_out[j] * H_out[h] * W[h, j]
                dV[i, h] = sum * H_out[h] * x[i]


        W = W + learning_rate * dW
        V = V + learning_rate * dV
        print(f"epoch:{step} output:{O_out}")
# 激活函数sigmoid的实现
def sigmoid(x):
    s = 1 / (1 + np.exp(-x))
    return s


def sigmoid_derivative(x):
    s = 1 / (1 + np.exp(-x))
    ds = s * (1 - s)
    return ds

# 主函数
if __name__ == '__main__':
    x = np.array([2, 5], dtype=float)
    y_true = np.array([3, 6, 4], dtype=float)
    BP(x, y_true, 10)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现KNN算法&搭建人工神经网络ANN——第三次数据挖掘实验 的相关文章

  • 如何使用 python 从嵌套表结构中识别最终父级?

    我有下表 我的问题是 我如何以编程方式识别最终父级 以下是通过示例解释的规则 the id 5 0的父母是51 0 身份证号51 0没有父母 因此 id5 0的最终父级是51 0 the id 6 0的父母是1 0 身份证号1 0的父母是1
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 使用 for 循环 Python 为数组赋值

    我正在尝试将字符串的值分配给不同的数组索引 但我收到一个名为 列表分配超出范围 的错误 uuidVal distVal uuidArray distArray for i in range len returnedList for beac
  • Django REST Framework:无法使用视图名称解析超链接关系的 URL

    我已经广泛研究了这个相当常见的问题 但没有一个修复对我有用 我正在 REST 框架中构建 Django 项目 并希望使用超链接关系 用户可以拥有许多独立的汽车和路线 路线是位置的集合 这些是我的序列化器 class CarSerialize
  • 不使用 graphviz/web 可视化决策树

    由于某些限制 我无法使用 graphviz webgraphviz com 可视化决策树 工作网络与另一个世界是封闭的 问题 是否有一些替代实用程序或一些 Python 代码用于至少非常简单的可视化可能只是决策树的 ASCII 可视化 py
  • Pythoncom - 将相同的 COM 对象传递给多个线程

    你好 对于 COM 对象 我是一个完全的初学者 非常感谢任何帮助 我正在开发一个Python程序 该程序应该以客户端 服务器的方式读取传入的MS Word文档 即客户端发送一个请求 一个或多个MS Word文档 服务器使用pythoncom
  • Tensorflow 到 ONNX 的转换

    我目前正在尝试转换我使用本教程创建的已保存 且正在工作 的 pb 文件 https github com thtrieu darkflow https github com thtrieu darkflow 到 onnx 文件中 我目前正在
  • 如何使用子进程打开新的浏览器选项卡?

    我正在打开一个新的 IE 窗口 subprocess Popen r os environ PROGRAMFILES Internet Explorer IEXPLORE EXE Call URL 当 IE 关闭时这很好 但即使打开它也会生
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Mac 上的 Errno 13 权限被拒绝

    我只是测试如何从一个 py 文件调用外部 py 文件 我有 2 个 py 文件 都在同一目录中 这是主要代码 runext py 假设调用 ext py import subprocess subprocess call Users tra
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • 在 Django 中翻译文件时的 Git 命令

    我在 Django 中有一个现有的应用程序 我想在页面上添加翻译 在页面上我有 trans Projects 在 po 文件中我添加了 templates staff site html 200 msgid Projects msgid P
  • 使用多行选项和编码选项读取 CSV

    在 azure Databricks 中 当我使用以下命令读取 CSV 文件时multiline true and encoding SJIS 似乎编码选项被忽略了 如果我使用multiline选项 Spark 使用默认值encoding那
  • Flask APScheduler + Gunicorn 工作人员 - 在套接字修复后仍在运行任务两次

    我有一个 Flask 应用程序 我使用 Flask APScheduler 在我的数据库上运行计划查询并通过 cron 作业发送电子邮件 我通过 Gunicorn 使用以下配置运行我的应用程序并通过主管进行控制 program myapp
  • 检测计算机何时解锁 Windows

    我用过这个优秀的方法 https stackoverflow com questions 20733441 lock windows workstation using python 20733443锁定 Windows 计算机 那部分工作
  • Django:在单独的线程中使用相同的测试数据库

    我正在使用具有以下数据库设置的测试数据库运行 pytests DATABASES default ENGINE django db backends postgresql psycopg2 NAME postgres USER someth
  • 在 Mac (Catalina) 上安装 PyGame 时出错 [重复]

    这个问题在这里已经有答案了 我一直在尝试将 PyGame 安装到 Catalina 上的 Mac 上 但不知道如何安装 我收到的错误消息是 SystemExit error command gcc failed with exit stat
  • 透视包含字符串的 Pandas Dataframe - “没有要聚合的数字类型”错误

    关于此错误有很多问题 但环顾四周后 我仍然无法找到 解决解决方案 我正在尝试用字符串旋转数据框 以使一些行数据变成列 但到目前为止还没有成功 我的 df 的形状
  • 有效积累稀疏 scipy 矩阵的集合

    我有一个 O N NxN 的集合scipy sparse csr matrix 每个稀疏矩阵都有 N 个元素集 我想将所有这些矩阵加在一起以获得一个常规的 NxN numpy 数组 N 约为 1000 矩阵内非零元素的排列使得所得总和肯定不
  • Pymongo 批量插入

    我正在尝试批量插入文档 但批量插入时不会插入超过 84 个文档 给我这个错误 in insert pymongo errors InvalidOperation cannot do an empty bulk insert 是否可以批量插入

随机推荐

  • 不同设备屏幕尺寸和DPR适配

    为什么需要适配 目前市面上设备屏幕属性十分多样化 宽度和DPR并不一致 而作为设计和前端开发 无法为每个尺寸的设备单独设计一套UI并将其转为前端代码 这不现实 所以我们需要一套方案来将一套设计稿完美呈现在不同尺寸的设备上 设备的多样性不止体
  • Vue的双向绑定

    看过无数遍 还是说不清楚 来个说人话的加深印象 首先再vue初始化的时候 就对data数据进行了劫持监听 其中就是监听器 Observe 用来监听所有属性 若有属性发生变化就需要告诉订阅者Watcher看是否需要更新 因为订阅者Watche
  • [Matlab科学计算] 欧拉角和坐标变换个人总结

    问题由来 在计算铁磁材料多晶体的有效模量时 需要考虑晶粒在多晶体中的方向分布 一般用三个欧拉角来表示晶粒在多晶体中的方向 用方向分布函数来表示某个方向的分布密度 基于此 迫使我要掌握欧拉角 但是在阅读众多教材和博客文章中发现 大家对欧拉角的
  • JAVA对象在内存中运行机制

    在方法中创建一个对象时 在方法栈中只存有对象在堆中的地址 对象本身存放在堆内存中 类中的非static成员属于对象在堆中被创建 类中的static成员属于类并在运行类时存放在永生代中
  • PV、EV、AC、BAC、EAC、ETC等的含义及计算公式

    PV EV AC BAC EAC ETC等计算公式含义 PV Planned Value 计划值 应该完成多少工作 按照计划截止目前应该花费的预算 AC Actual Cost 实际成本 完成工作的实际成本是多少 截止目前实际的花费 EV
  • multiple definition of(变量或者函数)

    今天在公司写项目的时候 遇到如下错误 半个小时了 没看出来问题出在哪里 我看了好几遍代码 确认没有重定义 后来问旁边的大牛 才发现自己手误 错吧 include area h 写成 include area c 千万得小心啊 有时候心里想的
  • Qt + C++编程问题系列1:解决因this指针被析构导致的崩溃问题<初识enable_shared_from_this类及使用智能指针的好处>

    这里是目录 前言 原因 解决办法 boost和C 11 结尾 前言 在基于Qt和C 开发的程序运行的时候 程序突然发生崩溃 在查找原因的时候花费的时间比较多 情形一般情况遇不到 因此写篇博客记录一下 原因 在Qt编程中 很多时候为了不让数据
  • Hive 安装与配置步骤

    Hive 安装与配置步骤 一 下载版本 1 1下载hive 1 2 直接用 wget 下载 1 3 解压 二 配置文件 2 1 修改hive env sh 2 2 修改hive log4j properties 2 3 配置MySQL作为M
  • C++库std::flush介绍

    std flush 介绍 使用场景 示例 调试场景 实时进度指示场景 保证日志完整性场景 介绍 std flush 是C 标准库 中的一个操作符 用于刷新输出流 刷新输出流表示将缓冲区中的数据立即发送到关联的输出设备 例如屏幕或文件 在某些
  • R语言金融分析作业(一)

    1 从WDI分别下载所有国家2016年和2017年GDP数据 1 计算经济增长 2 变成宽数据 library WDI library reshape 在线获取数据 DF lt WDI country all indicator NY GD
  • python导出时序数据精度缺失解决办法(对时序数据重采样)

    源码 import pandas as pd 导入数据 parse dates True 将时间转换成时间类型的索引 df pd read excel D 机器人采集数据样本 xlsx index col 时间 parse dates Tr
  • 七天玩转Redis

    目录 1 搭建环境 2 测试Redis 3 StringRedisTemplate 3 1 介绍 3 2 StringRedisTemplate常用操作 3 3 StringRedisTemplate的使用 4 RedisTemplate
  • Swing开发之JComboBox篇

    JList和ComboBox很相似 因为这两个组件都显示一个项列表 因此 它们都有扩展ListModel接口的模型 而且 这两个组件都有绘制器 这些绘制器通过实现ListCellBenderer接口来绘制列表单元 但是 列表和组合框在施工方
  • 装上后这 14 个插件后,PyCharm 真的是无敌的存在

    来源 Python编程时光 作者 写代码的明哥 Key Promoter X 如果让我给新手推荐一个 PyCharm 必装插件 那一定是 Key Promoter X 它就相当于一个快捷键管理大师 它时刻地在 教导你 当下你的这个操作 应该
  • linux查看设备网卡MAC和IP地址以及设置MAC ip的注意事项

    1 查看设备的MAC和IP Linux Unix操作系统熟悉的人都通常是用console命令控制台来进行相应的操作 Linux Unix操作系统查看网卡mac地址的方法可以通过以下命令获得 1 ifconfig a 2 ip link sh
  • 华为OD机试 - 简单的解压缩算法

    题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数字N 表示重复字符N次 例如 压缩内容为A3 表示原始字符串为AAA 2 花括号中的字符串加数字N 表示花括号中的字符重复N次 例如压缩内容为
  • Ubuntu检查apt-get软件列表

    1 搜索所有列表 sudo apt cache search all 2 搜索所有软件并去掉重复 sudo apt cache search all wc 3 检索指定软件 sudo apt cache search all grep gc
  • Android 全局黑白化-模拟颜色空间

    概述 平台 RK3568 Android 11 在一些特殊的日子 如默哀日 灾难日 纪念日 哀悼日等 许多的APP 网页 海报等都开始使用黑白色主题 Android 的全局黑白实现方案 可以考虑使用模拟颜色空间的方法 借助硬件加速渲染选项
  • Altium Designer 20 (14)——绿色报错消除

    一 问题 再更新完PCB之后会有绿色报错 二 问题解决 这是一种错误提示 2 1 解决一 按下TM 复位绿色报错 但是移动就会出现 2 2 解决二 设计规则检查 关掉所有检查 留下电器检查 这样要还是存在绿色报错 点击TM 2个按键就好了
  • 实现KNN算法&搭建人工神经网络ANN——第三次数据挖掘实验

    实验结果直接戳这里免费下载实验报告 决策树算法的实验还没做 做了之后再上传吧 最近有点忙555 文章目录 1 KNN算法 1 1 KNN算法原理 1 2 KNN算法的优点 1 3 KNN算法的缺点 1 4 KNN的做法 目的 1 5 编程实