K邻近算法

10 篇文章 0 订阅
10 篇文章 0 订阅

简介

介绍了非常简单的算法:K邻近算法,即KNN。

在这里插入图片描述


基本介绍

K-近邻算法(K-Nearest Neighbors,简称KNN)是一种基本且广泛应用的监督学习算法,主要用于分类和回归任务。

工作原理非常简答直观:所谓近朱者赤、近墨者黑。为了判断测试样本的类别,以所有的测试集样本为参照,计算测试样本与训练集所以样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则**(majority-voting)**,根据这些邻居的信息来预测新数据点的分类或数值。

KNN算法的应用

  • 分类任务:如在医疗领域根据患者的历史数据来预测疾病的类型。
  • 回归任务:如预测房价或股票价格。
  • 推荐系统:如根据用户的购买历史和偏好来推荐商品。

KNN算法的简单性和有效性使其成为许多领域中常用的基准算法之一。然而,它在处理大规模数据集时的计算和存储需求较高,这可能限制了其在某些应用中的实用性。


特点

非参数算法:KNN是一种非参数学习算法,这意味着它不对数据的分布做任何假设。这是它与其他统计学习方法最大的不同。

惰性学习器:KNN属于惰性学习方法,因为它实际上不会从训练数据中学习一个判别函数,而是直接使用训练数据进行预测,简单粗暴。

距离度量:KNN算法中的距离可以是任何度量距离,常见的有欧氏距离、曼哈顿距离或明可夫斯基距离,这在我写的聚类分析那篇文章有详细列举和介绍。


步骤

step 1 选择邻居数量K

K的选择会对算法结果有很大影响。

较小的K值意味着噪声将对结果有更大影响,而较大的K值则使计算成本更高并可能导致分类器过于平滑,拟合效果不佳。

step 2 计算距离

计算测试点与每个训练数据点之间的距离。

step 3 找到最近的K个邻居

选择距离最近的K个训练数据点作为邻居。

step 4 进行预测

对于分类任务,通常采用“投票制”,即在K个最近邻居中多数类别为预测类别;

对于回归任务,则通常是这K个邻居的输出变量的平均值。


KNN运用实例

我们运用一下 sklearn.datasets 中的 load_breast_cancer 数据集

# 导入库
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer  # 使用乳腺癌维斯康数据
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score

# 示例数据集
data = load_breast_cancer()
print(data)
print(type(data))  # data的类型为<class 'sklearn.utils._bunch.Bunch'>
print("目标变量名称:", data.target_names)  # 目标变量名称: ['malignant' 'benign'],即良性和恶性

df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target
print(df)

# 将 target_names 映射到整数值
target_map = {'malignant': 1, 'benign': 0}
df['target'] = np.where(df['target'] == 0, 'benign', 'malignant')  # 将整数映射到字符
df['target'] = df['target'].map(target_map)  # 将字符映射到整数

# 划分训练集
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=100)

# 创建KNN模型,建立实例,设置邻居数为3
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)
results_df = X_test.copy()
results_df['Actual'] = y_test
results_df['Predicted'] = y_pred
print(results_df.head())

# 评价
auc = accuracy_score(y_test, y_pred)
print(f"准确率为:{format(auc)}")
recall = recall_score(y_test, y_pred)
print(f"召回率为:{format(recall)}")
pre = precision_score(y_test, y_pred)
print(f"精确度为:{format(pre)}")
f1 = f1_score(y_test, y_pred)
print(f"F1-SCORE为:{format(f1)}")

在这里插入图片描述

我们可以发现,评价的结果还是很好的。

np.where() 函数

NumPy 库中的一个函数,用于根据指定条件返回输入数组、标量或者另外两个数组中对应位置的元素。基本语法如下:

np.where(condition, x, y)
  • condition 是一个条件表达式,可以是布尔数组或者条件表达式。
  • 如果 condition 中的元素为 True,则将 x 对应位置的元素添加到返回的数组中;如果为 False,则将 y 对应位置的元素添加到返回的数组中。

map() 方法

  • map() 方法是 Pandas 库中 Series 类型的一个方法,用于根据提供的字典、Series 或函数映射数据中的值。它的基本语法如下:
Series.map(arg)
  • arg 可以是一个字典、Series 或者一个接受单个参数并返回一个值的函数。
  • map() 方法会将数据中的每个元素通过映射规则转换成另一个值,并返回一个新的 Series 对象。
  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值