机器学习(四)KNN算法-分类

一 样本距离

A(X11,X12,......,X1n)与B(X21,X22,......,X2n)

闵可夫斯基距离是将多个距离公式总结而成的一个公式。

当p=1,是曼哈顿距离;p=2,欧式距离;p为无穷大,就是切比雪夫距离。

二 KNN算法原理

k-近邻算法,根据k个邻居样本的类别来判断当前样本的类别。

如果一个样本在特征空间的k个最相似也就是最临近样本的大多数属于某个类别,则该类别也属于这个类别。

打个比方,在一百个物品中,选择十个距离样本最近的物品,其中类别1有1,类别二有5,类别三有3,类别四有1。那么就认为样本属于类别二,因为离其最近的十个物品有五个都是类比二,这就是KNN。

三 KNN缺点

对于大规模的数据集,要计算测试样本与所有训练样本的距离,其计算量大;对于高维数据,距离度量变得不那么有意义,也就是维度灾难;

四 API

复制代码
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

参数:

(1)n_neighbors:

int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K

(2)algorithm:

{'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto'。找到近邻的方式,注意不是计算距离 的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'

方法:fit(x,y) x作为训练数据,y作为目标数据、predict(x)预测提供的数据,得到预测数据

五 代码实例

复制代码
print(pd.DataFrame(res.toarray(),columns=transfer.get_feature_names_out()))
#%%
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
'''保存模型'''
import joblib
'''获取数据'''
iris = load_iris()

'''打印形状,只有4个特征,150个样本'''
print("鸢尾花形状:", iris.data.shape)
'''4个特征的描述'''
print("鸢尾花特征描述:", iris.feature_names)

'''150个目标,对应150个样本的类别'''
print(iris.target.shape)
'''目标值只有012三种,说明150个样本属于三类中的一种'''
print(iris.target_names)

'''数据集的划分'''
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=22)

'''特征工程,标准化,只有4个特征'''
transfer=StandardScaler()
'''对训练特征进行标准化,对测试也做。
因为fit_transform中已经有fit进行计算了,则x_test只需要做transform。
训练中用的什么数据,模式只能识别到什么样的数据'''
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

'''KNN算法预估器,k=7表示找7个邻近来判断自身类型'''
estimator = KNeighborsClassifier(n_neighbors=7)
'''该步骤就是estimator根据训练特征和训练模型再自己学习,让它自己变聪明'''
estimator.fit(x_train, y_train)

'''模型评估,测试一下estimator'''
y_predict=estimator.predict(x_test)#y_predict预测的目标结果
print("预测结果:", y_predict)
print("准确率:", y_test == y_predict)

''''计算准确率'''
score = estimator.score(x_test, y_test)
print("准确率为:\n", score) 

'''保存模型'''

joblib.dump(estimator, "../data/estimator.pkl")
'''加载模型'''
estimator = joblib.load("../data/estimator.pkl")
'''使用模型预测'''
y_test = estimator.predict([[0.4,0.2,0.4,0.6]])
print("预测结果:", y_test)

结果:

鸢尾花形状: (150, 4)

鸢尾花特征描述: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

(150,)

'setosa' 'versicolor' 'virginica'

预测结果: [2 1 1 1 2 1 2 2 1 1 0 1 0 0 1 2 1 0 2 1 1 0]

准确率: [ True True False True True True True True True True True True

True True True True True True True True True True]

准确率为:

0.9545454545454546

预测结果: [1]

拓展

KNN实现葡萄酒分类

相关推荐
Terrence Shen19 小时前
【CUDA编程系列】之01
c++·人工智能·深度学习·机器学习
墨有66619 小时前
数学分析栈的出栈顺序:从算法判断到数学本质(卡特兰数初探)
c++·算法·数学建模
zhutoutoutousan19 小时前
氛围数学学习:用游戏化思维征服抽象数学
学习·算法·游戏
综合热讯19 小时前
脑机接口赋能 认知障碍诊疗迈入精准时代
人工智能·机器学习·数据挖掘
guygg8820 小时前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab
fengfuyao98520 小时前
遗传算法与粒子群算法求解非线性函数最大值问题
算法
LeetCode天天刷20 小时前
【软件认证】比特翻转【滑动窗口】
算法
源代码•宸20 小时前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
s砚山s20 小时前
代码随想录刷题——二叉树篇(十三)
数据结构·算法
alphaTao20 小时前
LeetCode 每日一题 2026/1/5-2026/1/11
算法·leetcode