K-近邻算法的python实现代码分享

下面是详细讲解“K-近邻算法的Python实现代码分享”的完整攻略。

K-近邻算法

K-近邻算法是一种常用的分类算法,其基本思想是在训练集中找到与测试样本最近的K个样本,然后根据这K个样本的类别投票,将测试样本归为票数最多的类别。

下面是一个Python实现K-近邻算法的示例:

import numpy as np

def knn(X_train, y_train, X_test, k=3):
    distances = []
    for i in range(len(X_train)):
        distance = np.sqrt(np.sum(np.square(X_test - X_train[i, :])))
        distances.append([distance, i])
    distances = sorted(distances)
    k_neighbors = [y_train[distances[i][1]] for i in range(k)]
    return max(k_neighbors, key=k_neighbors.count)

X_train = np.array([[1, 2], [2, 3], [3, 1], [4, 2]])
y_train = np.array([0, 0, 1, 1])
X_test = np.array([3, 2])

prediction = knn(X_train, y_train, X_test, k=3)
print("Prediction: ", prediction)

上述代码中,首先定义了一个knn函数,函数接受训练集X_train、训练集标签y_train、测试集X_test和K值k。在函数中,计算测试样本与训练样本之间的距离,并将距离和训练样本的索引存储在distances列表中。然后,对distances列表进行排序,并选取前K个距离最近的训练样本的标签,将存储在k_neighbors列表中。最后,返回k_neighbors中出现次数最多的标签。

然后,定义了一个训练集X_train、练集标签y_train和测试集X_test。在本例中,训练集包含4个样本,每个样本有2个特征,标签分别为0和1。测试集包含1个样本,也有2个特征。

最后,使用测试集调用knn函数,计算测试样本的标签。

K-近邻算法的优化

K-邻算法的计算复杂度较高,因为需要计算测试样本与所有训练样本之间的距离。为了提高算的效率,可以使用KD树来优化K-近邻算法。

下面是一个使用KD树优化K-近邻算法的Python示例:

from collections import Counter
import numpy as np

class KDTree:
    def __init__(self, data, depth=0):
        if len(data) > 0:
            k = len(data[0])
            axis = depth % k
            sorted_data = sorted(data, key=lambda x: x[axis])
            mid = len(sorted_data) // 2
            self.location = sorted_data[mid]
            self.left_child = KDTree(sorted_data[:mid], depth+1)
            self.right_child = KDTree(sorted_data[mid+1:], depth+1)
        else:
            self.location = None
            self.left_child = None
            self.right_child = None

    def search_knn(self, point, k=3, dist_func=lambda x, y: np.sqrt(np.sum(np.square(x - y)))):
        knn = []
        self._search_knn(point, k, knn, dist_func)
        return [x[1] for x in sorted(knn)]

    def _search_knn(self, point, k, knn, dist_func):
        if self.location is None:
            return
        distance = dist_func(point, self.location)
        if len(knn) < k:
            knn.append((distance, self.location))
        elif distance < knn[-1][0]:
            knn.pop()
            knn.append((distance, self.location))
        axis = len(point) % len(self.location)
        if point[axis] < self.location[axis]:
            self.left_child._search_knn(point, k, knn, dist_func)
        else:
            self.right_child._search_knn(point, k, knn, dist_func)

def knn(X_train, y_train, X_test, k=3):
    tree = KDTree(X_train)
    knn_indices = tree.search_knn(X_test, k=k)
    k_neighbors = [y_train[i] for i in knn_indices]
    return Counter(k_neighbors).most_common(1)[0][0]

X_train = np.array([[1, 2], [2, 3], [3, 1], [4, 2]])
y_train = np.array([0, 0, 1, 1])
X_test = np.array([3, 2])

prediction = knn(X_train, y_train, X_test, k=3)
print("Prediction: ", prediction)

上述代码中,首先定义了一个KDTree类,该类用于构建KD树。在类的构造函数中,根据当前深度选择划分的维度,然后将数据集按照该维度排序,并选择中位数作为当前节点的位置。然后,递归构建左子树和右子树。

然后,定义了一个search_knn方法,该方法用于搜索距离测试样本最近的K个训练样本。在方法中,使用递归搜索KD树,找到距离测试样本最近的K个训练样本,并将其存储在knn列表中。

最后,定义了一个knn函数,该函数接训练集X_train、训练集标签y_train、测试集X_test和K值k。在函数中,使用KD树搜索距离测试样本最近的K个训练样本的标签,并返回出现次数最多的标签。

然后,定义了一个训练集X_train、训练集标签y_train和测试集X_test。在本例中,训练集包4个样本,每个样本有2个特征,标签分别为0和1。测试集包含1个样本,也有2个征。

最后,使用测试集调用knn函数,计算测试样本的标。

总结

K-近邻算法是一种常用的分类算法,可以使用KD树来优化算法的效率。Python中可以使用NumPy库和collections库进行实现。在实现过程中,需要定义KDTree类和knn函数,并使用递归KD树,找到距离测试样本最近的K个训练样本的标签。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:K-近邻算法的python实现代码分享 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python 处理带有 \u 的字符串操作

    当字符串中包含转义字符 \u,表示这是一个unicode字符,需要进行相应的处理。Python提供了多种处理unicode字符的方法,下面详细介绍如何处理带有 \u 的字符串。 方法1:使用Python内置的encode和decode方法 将带有 \u 的unicode字符串编码成utf-8格式 s = ‘\u4e2d\u56fd’ s_utf8 = s.e…

    python 2023年5月20日
    00
  • 详解Python如何实现Excel数据读取和写入

    下面我详细讲解如何使用Python实现Excel数据的读取和写入操作。这篇攻略主要包含以下几个部分: 如何安装必要的Python库以实现Excel读写操作; 如何使用Python打开Excel文件; 如何读取Excel文件中的数据; 如何向Excel文件中写入数据; 示例演示。 1. 安装必要的Python库 在开始实现Excel读写操作之前,必须先安装必要…

    python 2023年5月13日
    00
  • Python用matplotlib库画图中文和负号显示为方框的问题解决

    下面为你详细讲解“Python用matplotlib库画图中文和负号显示为方框的问题解决”的完整攻略。 问题描述 在使用Python的matplotlib库进行图形绘制时,有时会发现中文和负号显示为方框的情况。这是因为matplotlib默认的字体不支持中文和负号,需要手动设置支持中文和负号的字体才能解决这个问题。 解决方法 1. 安装支持中文和负号的字体 …

    python 2023年5月18日
    00
  • python常规方法实现数组的全排列

    以下是“Python常规方法实现数组的全排列”的完整攻略。 1. 什么是全排列 全排列是指将一个集合中的元素进行排列,使得每个元素都出现一次,且顺序不同。例如,集合{1, 2, 3}的全排列为{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 2. Python常规方法实现数组的全排列 P…

    python 2023年5月13日
    00
  • python爬虫可以爬什么

    Python爬虫是一种自动化获取互联网信息的技术,其可以爬取几乎所有类型的互联网数据,包括但不限于: 网页内容 爬虫可以获取网页的HTML、CSS和JavaScript等信息,通常会对这些信息进行解析、筛选和整合,最终将需要的信息提取出来。比如,可以爬取论坛、博客、新闻网站等各类网站的内容,用于文本分析、信息聚合等。 示例1:从新浪财经网站爬取A股上市公司信…

    python 2023年5月14日
    00
  • python实现商品进销存管理系统

    Python实现商品进销存管理系统攻略 系统需求分析 商品进销存管理系统主要涉及以下几个模块:- 商品信息维护- 进货管理- 销售管理- 库存管理 该系统需要能够实现如下功能:- 添加、修改、删除商品信息,包括商品名称、规格、单位、进价、售价等- 查看、修改进货单据,包括进货日期、商品名称、数量、单价等- 查看、修改销售单据,包括销售日期、商品名称、数量、单…

    python 2023年5月30日
    00
  • 使用jupyter notebook将文件保存为Markdown,HTML等文件格式

    使用Jupyter Notebook将文件保存为Markdown、HTML等文件格式 Jupyter Notebook是一种交互式笔记本,可以用于数据分析、可视化、机器学习等。在Jupyter Notebook中,我们可以将笔记本中的内容保存为Markdown、HTML等文件格式,方便我们进行分享和展示。本文将详细讲解如何使用Jupyter Notebook…

    python 2023年5月15日
    00
  • Python re.search 变量的完全匹配

    【问题标题】:Python re.search exact match on variablePython re.search 变量的完全匹配 【发布时间】:2023-04-01 16:12:01 【问题描述】: iplist.txt的内容是这样的格式: CART 6385 Cell IP: 10.10.10.10 CART 3854 Cell IP: 10…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部