k-近临算法是什么?——简单实现和样例

一、k-近邻算法

        1.1 k-近邻算法介绍

        k-近邻(k-nearest neighbors, k-NN)算法是一种常见的机器学习方法,主要用于分类和回归问题。该算法基于一个简单的思想:如果一个样本在特征空间中的k个最近邻居中的大多数属于某个类别,则该样本也属于这个类别。

        在k-近邻算法中,通过比较不同样本之间的特征相似度,确定新样本的类别或者数值标签。k-NN的工作原理很直观,通过测量不同样本之间的距离(如欧氏距离),找到离目标样本最近的k个邻居,然后利用它们的类别标签(对于分类问题)或数值标签的平均值(对于回归问题)来预测目标样本的类别或值。

        这个算法非常易于理解,不需要进行模型训练,但是在大规模数据集上的计算成本较高。

        1.2 k-近邻算法的基本流程

        1. 准备数据:收集样本数据,并且对每个样本进行标记(分类问题)或者赋予数值标签(回归问题)。

        2. 确定k值:选择合适的k值,即要考虑的最近邻居的数量。

        3. 计算距离:对于新的样本数据,计算它与训练集中所有样本的距离,通常使用欧氏距离或其他距离度量来衡量样本之间的相似度。

        4. 找到k个最近邻:选择与新样本距离最近的k个样本。

        5. 进行预测:
             分类问题:对于分类问题,统计这k个样本中各个类别的频数,将新样本分配给频数最高的类别。
             回归问题:对于回归问题,计算这k个样本的平均数值,并将该平均值作为新样本的预测结果。

        6. 输出结果:得到新样本的分类或数值标签作为预测结果。

二、利用k近邻算法实现水果分类

        2.1实验目的

        本次实验旨在通过k近邻算法对苹果和香蕉进行分类,通过提取这两种水果的两种特征:直径和高度,来进行分类。

        2.2数据准备

# 随机生成苹果和香蕉的样本数据
apple_data = np.random.rand(10, 2) * [2 + 1, 2] + [5, 8]
banana_data = np.random.rand(10, 2) * [2, 2] + [3, 7]
# 组合所有数据
all_data = np.vstack([apple_data, banana_data])
labels = np.array([0] * 10 + [1] * 10)  # 0表示苹果,1表示香蕉

        这里生成了10个苹果的数据,直径在5-7cm之间,高度在8-10cm之间,10个香蕉的数据,直径在3-5cm之间,高度在7-9cm之间。

        2.3数据处理

        可以使用 scikit-learn 库中的 MinMaxScaler 来进行数据归一化处理

# 数据归一化处理
scaler = MinMaxScaler()
all_data_normalized = scaler.fit_transform(all_data)

        2.4代码实现

import numpy as np
import matplotlib.pyplot as plt
import operator
from sklearn.preprocessing import MinMaxScaler

def knn(test_data, all_data, data_labels, k):
    data_size = all_data.shape[0]
    
    # 计算距离
    delta_data = np.tile(test_data, (data_size, 1)) - all_data
    distances = (delta_data ** 2).sum(axis=1) ** 0.5
    
    # 排序
    sorted_indices = distances.argsort()
    
    class_count = {}
    # 找到与待测数据最近的前k个数据
    for i in range(k):
        label = data_labels[sorted_indices[i]]
        class_count[label] = class_count.get(label, 0) + 1
    
    sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
    return sorted_class_count[0][0]

# 随机生成苹果和香蕉的样本数据
apple_data = np.random.rand(10, 2) * [2 + 1, 2] + [5, 8]
banana_data = np.random.rand(10, 2) * [2, 2] + [3, 7]

# 组合所有数据
all_data = np.vstack([apple_data, banana_data])
labels = np.array([0] * 10 + [1] * 10)  # 0表示苹果,1表示香蕉

# 数据归一化处理
scaler = MinMaxScaler()
all_data_normalized = scaler.fit_transform(all_data)

# 生成一个随机测试数据,并进行归一化
test_data = np.random.rand(1, 2) * [3, 3] + [2, 2]
test_data_normalized = scaler.transform(test_data)

# 调用knn函数进行预测
result = knn(test_data_normalized, all_data_normalized, labels, 3)
print("预测结果:", "苹果" if result == 0 else "香蕉")

三、总结

        在本次学习过程中,我们通过Python示例实现了K-近邻算法。首先,我们随机生成了苹果和香蕉的样本数据,并使用KNN算法来对新样本进行分类。在示例代码中,我们还加入了数据归一化的功能,以确保不同特征有相同的重要性。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值