IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 简单的理解K近邻算法的实现 -> 正文阅读

[数据结构与算法]简单的理解K近邻算法的实现

K近邻算法介绍

  • 近朱者赤,近墨者黑
  • 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一类别,则该样本也属于该类别

总结knn工作流程

  • 计算待分类物体与其他物体之间的距离
  • 统计距离最近的k个邻居
  • 对于k个邻居,他们属于哪种分类多,待分类物体就属于哪一类

1.手动实现KNN算法

五个步骤

1.读取数据
2.数据的基本处理
3.特征工程
4.数据可视化
训练数据 特征:打斗和亲吻次数 类别:电影类型
预测数据
5.算法实现

  • 导入所需要的模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  • 替换Microsoft YaHei字体
  • 解决坐标轴负数的负号显示问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  
plt.rcParams['axes.unicode_minus'] = False   

1.读取数据

my_df = pd.read_excel('电影数据.xlsx')
print(my_df)

在这里插入图片描述

我们需要判断美人鱼电影是动作片还是爱情片,就需要看这个电影距离哪些电影最近,我们选择近邻点个数k为3来做出判断

class MYknn(object):
    def __init__(self, train_df, k):
        """
        :param train_df: 训练数据
        :param k: 近邻点个数
        """
        self.train_df = train_df
        self.k = k

    def predict(self, test_df):
        """预测函数"""
        # 计算欧式距离
        self.train_df['距离'] = np.sqrt((test_df['打斗次数']-train_df['打斗次数'])**2+(test_df['打斗次数']-train_df['接吻次数'])**2)
        # 按距离排序 前K个数据的类别
        my_types = self.train_df.sort_values(by='距离').iloc[:self.k]['电影类型']
        print(my_types)
        my_type = my_types.value_counts().index[0]
        print(my_type)
        
# 训练数据  特征:打斗和亲吻次数  类别:电影类型
train_df = my_df.loc[:5, ['打斗次数', '接吻次数', '电影类型']]
print(train_df)
# 预测数据
test_df = my_df.loc[6, ['打斗次数', '接吻次数']]
print(test_df)

2.算法实现

mk = MYknn(train_df, 3)
mk.predict(test_df)

按距离排序离哪个最近,我们可以发现美人鱼电影距离这三个爱情片是最近的,所以,我们可以认为这是个爱情片。

距离3最近 然后是4 最后是5

当底下出现俩个爱情片,一个动作片的时候我们需要做出判断,得出出现次数最多的电影,来以此进行分类,可见这个电影出现最多的是爱情

在这里插入图片描述

2.手动实现KNN算法鸢尾花的实现

注:可以通过该类鸢尾花的 “ 花萼长度 花萼宽度 花瓣长度 花瓣宽度 ” 信息来得到,此类鸢尾花属于以下三种的哪一种 “ 山鸢尾 变色鸢尾 维吉尼亚鸢尾 ”

  • 导入所需模块
import numpy as np
from sklearn import datasets  # 可以提供数据集
from sklearn.model_selection import train_test_split   # 分割训练数据和测试数据
from collections import Counter  # 计数器

1.导入数据

  • 可以得到鸢尾花对应的四个特征和三个类别

  • data 对应的以下四个特征
    花萼长度 花萼宽度 花瓣长度 花瓣宽度

  • target 类别目标对应以下三种类别
    山鸢尾 变色鸢尾 维吉尼亚鸢尾

iris = datasets.load_iris()
# print(iris)
# print(iris.data.shape)
X = iris.data
Y = iris.target
print(X, Y)

2.训练数据和测试数据

  • X_train, X_test, Y_train, Y_test 分别代表:训练数据集特征 测试集特征 训练数据类别 测试数据类别这四类
  • 后面添加的random——state可以让随机的数值不发生改变,如果我们不添加的话,训练数据和测试数据将会随机改变
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=2003)
print(len(X_train))

3.算法实现

  • 计算两个样本之间欧式距离
    instance1:样本1
    instance2:样本2
def euc_dis(instance1,instance2):
    dist = np.sqrt(sum((instance1-instance2)**2))
    return dist

4.建模

  • 给定一个测试数据testInstance,通过KNN算法预测它的标签
    X:训练数据的特征
    y:训练数据的标签
    testInstance : 测试数据 假定 一个测试数据array类型
    k:选择多少个近邻点
def knn_classify(X, y, testInstance, k=3):
    distance = [euc_dis(x,testInstance) for x in X]  # 每个训练数据到测试数据的距离集合
    print(distance)
    # 排序
    kneighbors = np.argsort(distance)[:k]
    # 投票
    count = Counter(y[kneighbors])
    return count.most_common()[0][0]
  • 排序解释
  • 返回的结果是从小到大的索引值
print(np.argsort([11, 2.5, 3.6, 1.5, 9]))

在这里插入图片描述

5.测试(预测模型的好坏)

  • 其中 012 代表着三种类别
  • 模型的正确率是0.921,可见模型效果很好
pred = [knn_classify(X_train,Y_train,data,3) for data in X_test]
print(pred)
count = np.count_nonzero((pred == Y_test) == True)
print(count)
print('模型预测正确率:%.3f'%(count/len(X_test)))
  • 当我们发现列表中第一个数据是1 ,代表着第一个花的四个特征来识别出此类花是变色鸢尾 如果是0就是山鸢尾,以此来达到花瓣的预测在这里插入图片描述

3.自带模型的实现(自带API的实现)

添加链接描述

  • API说明文档
  • 导入所需模块
import numpy as np
from sklearn import datasets  # 自带数据集
from sklearn.model_selection import train_test_split  # 分割训练数据和测试数据
from sklearn.neighbors import KNeighborsClassifier
from sklearn.externals import joblib  # 加载和保存模型

1. 导入数据

iris = datasets.load_iris()
X = iris.data
y = iris.target

2. 训练数据和测试数据

X_train, X_test, y_train, y_test = train_test_split(X, y)

3. 实例化KNN算法分类器

clf = KNeighborsClassifier(n_neighbors=7)

4. 训练

clf.fit(X_train,y_train)

5. 预测

count = np.count_nonzero((clf.predict(X_test) == y_test) == True)
print('模型预测正确率:%.3f'%(count/len(X_test)))

6.保存模型(把我们测试好的模型保存起来,下次使用就不需要训练了

joblib.dump(clf,“test.pkl”)

7. 读取模型

clf = joblib.load("test.pkl")
count = np.count_nonzero((clf.predict(X_test) == y_test) == True)
print('模型预测正确率:%.3f'%(count/len(X_test)))

4.常用距离计算方法

常用距离计算方法:
欧氏距离(欧几里得距离)
曼哈顿距离
闵可夫斯基距离
切比雪夫距离
余弦距离

  • 以下是对这几种常用距离的方法进行解释
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:08:35  更:2021-10-19 12:08:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:20:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码