实现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——第三次数据挖掘实验 的相关文章

  • 从数据框中按索引删除行

    我有一个数组wrong indexes train其中包含我想从数据框中删除的索引列表 0 63 151 469 1008 要删除这些索引 我正在尝试这样做 df train drop wrong indexes train 但是 代码失败
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • django_openid_auth TypeError openid.yadis.manager.YadisServiceManager 对象不是 JSON 可序列化

    I used django openid auth在我的项目上 一段时间以来它运行得很好 但今天 我测试了该应用程序并遇到了这个异常 Environment Request Method GET Request URL http local
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 为什么Python的curses中escape键有延迟?

    In the Python curses module I have observed that there is a roughly 1 second delay between pressing the esc key and getc
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • 如何通过在 Python 3.x 上按键来启动和中断循环

    我有这段代码 当按下 P 键时会中断循环 但除非我按下非 P 键 否则循环不会工作 def main openGame while True purchase imageGrab if a sum gt 1200 fleaButton ti
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 具有自定义值的 Django 管理外键下拉列表

    我有 3 个 Django 模型 class Test models Model pass class Page models Model test models ForeignKey Test class Question model M

随机推荐

  • 不同设备屏幕尺寸和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 编程实