2024最新分别用sklearn和NumPy设计k-近邻法对鸢尾花数据集进行分类(包含详细注解与可视化结果)

server/2024/10/9 5:01:20/

本文章代码实现以下功能:

利用sklearn设计实现k-近邻法。

利用NumPy设计实现k-近邻法。

将设计的k-近邻法对鸢尾花数据集进行分类,通过准确率来验证所设计算法的正确性,并将分类结果可视化。

评估k取不同值时算法的精度,并通过可视化展示。

sklearn实现

# (1)数据导入,分割数据
# 导入iris数据集
from sklearn.datasets import load_iris# 分割数据模块
from sklearn.model_selection import train_test_split# (2)K最近(KNN,K-Nearest Neighbor)分类算法
from sklearn.neighbors import KNeighborsClassifier# 加载iris数据集
data = load_iris()
# 导入数据和标签
data_X = data.data
data_y = data.target# ———————画图,看第一和第三特征的分布——————————————————
import matplotlib.pyplot as plt
print(data.feature_names)
# print(data.data[:, 0])
# print(data.data[:, 2])
feature_1 = data.data[:, 0] # 设置横坐标标签 代表的是花萼长度
feature_3 = data.data[:, 2]  # 设置纵坐标标签 代表的是花瓣宽度
plt.scatter(feature_1, feature_3)  # 看数据分布
plt.show()# _--------------------150个数据的行索引号0-149------------
plt.scatter(feature_1[:50], feature_3[:50], c='red')  # 第一类
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet')  # 第二类
plt.scatter(feature_1[100:], feature_3[100:], c='darkred')  # 第三类
plt.show()# 分割数据# 将完整数据集的70%作为训练集,30%作为测试集,
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。
X_train, X_test, y_train, y_test = train_test_split(data_X,data_y,random_state=12,stratify=data_y,test_size=0.3)
# 建立模型进行训练和预测# 建立模型
knn = KNeighborsClassifier()
# knn=KNeighborsClassifier(n_neighbors=3)# (3)训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))  # 计算模型的准确率# (4)预测模型
y_pred = knn.predict(X_test)
print(y_pred - y_test)# (5)评价— ——用accuracy_score计算准确率— ———————
from sklearn.metrics import accuracy_scoreprint(accuracy_score(y_test, y_pred))  # 也可以算正确率print(accuracy_score(y_test, y_pred, normalize=False))  # 统计测试样本分类的个数# 测试不同的k值
k_range = range(1, 31)  # 测试1到30的k值
accuracy = []  # 用于存储每个k值的准确率for k in k_range:knn = KNeighborsClassifier(n_neighbors=k)knn.fit(X_train, y_train)y_pred = knn.predict(X_test)accuracy.append(accuracy_score(y_test, y_pred))# 绘制k值与准确率的关系图
plt.figure(figsize=(10, 6))
plt.plot(k_range, accuracy, marker='o', linestyle='-', color='b')
plt.title('KNN Varying number of neighbors')
plt.xlabel('Number of neighbors, k')
plt.ylabel('Accuracy')
plt.xticks(k_range)
plt.grid(True)
plt.show()# (6)保存和加载模型
import joblib# 用joblib.dump保存模型
joblib.dump(knn, 'iris_KNN.pkl')
# # 用joblib.load加载已保存的模型
knn1 = joblib.load('iris_KNN.pkl')
# #测试读取后的Model
print(knn1.predict(data_X[0:1]))  # 预测第一个数据的类别
y_pred1 = knn1.predict(X_test)
print(y_pred1 - y_test)# 可视化分类结果
plt.figure(figsize=(8, 6)) #设置图形的大小为8英寸宽和6英寸高。#绘制实际类别
plt.scatter(feature_1[:50], feature_3[:50], c='red', label='Actual Setosa')
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet', label='Actual Versicolor')
plt.scatter(feature_1[100:], feature_3[100:], c='darkred', label='Actual Virginica')#绘制预测类别
plt.scatter(X_test[y_pred == 0][:, 0], X_test[y_pred == 0][:, 2], c='lightcoral', marker='x', label='Predicted Setosa')
plt.scatter(X_test[y_pred == 1][:, 0], X_test[y_pred == 1][:, 2], c='lightblue', marker='^', label='Predicted Versicolor')
plt.scatter(X_test[y_pred == 2][:, 0], X_test[y_pred == 2][:, 2], c='pink', marker='s', label='Predicted Virginica')plt.xlabel('Sepal Length')
plt.ylabel('Petal Width')
plt.title('KNN Classification Result on Iris Dataset')
plt.legend()
plt.grid(True)
plt.show()

实现结果

用Numpy实现

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 加载iris数据集
data = load_iris()
X = data.data
y = data.target# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=12, stratify=y)# 定义欧氏距离函数
def euclidean_distance(x1, x2):return np.sqrt(np.sum((x1 - x2) ** 2))# 实现KNN算法
class KNN:def fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X, k=3):y_pred = [self._predict(x, k) for x in X]return np.array(y_pred)def _predict(self, x, k):# 计算x与训练集中每个点的距离distances = [euclidean_distance(x, x_train) for x_train in self.X_train]# 获取k个最近邻的索引k_indices = np.argsort(distances)[:k]# 获取这些最近邻对应的标签k_nearest_labels = [self.y_train[i] for i in k_indices]# 通过多数投票确定预测类别most_common = np.bincount(k_nearest_labels).argmax()return most_common# 实例化KNN
knn = KNN()# 训练模型
knn.fit(X_train, y_train)# 进行预测
y_pred = knn.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 评估不同k值的准确率
k_values = range(1, 31)
accuracies = []for k in k_values:knn = KNN()knn.fit(X_train, y_train)y_pred = knn.predict(X_test, k=k)accuracy = accuracy_score(y_test, y_pred)accuracies.append(accuracy)# 可视化k值与准确率的关系
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(k_values, accuracies, marker='o')
plt.xlabel('Number of Neighbors')
plt.ylabel('Accuracy')
plt.title('KNN Varying number of neighbors')
plt.grid(True)# 可视化分类结果
plt.subplot(1, 2, 2)
plt.scatter(X_test[:, 2], X_test[:, 3], c=y_pred, cmap=plt.cm.Set1, edgecolor='k')
plt.title('KNN Classification Result')
plt.xlabel('Petal Length')
plt.ylabel('Petal Width')
handles, labels = plt.gca().get_legend_handles_labels()
plt.legend(handles, labels, loc='upper left')
plt.grid(True)plt.tight_layout()
plt.show()# 找出最高精度和对应的k值
max_accuracy = max(accuracies)
best_k = k_values[accuracies.index(max_accuracy)]
print(f"The best accuracy is {max_accuracy:.2f} with k = {best_k}")

实现结果


http://www.ppmy.cn/server/129100.html

相关文章

2024年下半年软考准考证什么时候打印?

2024年下半年软考准考证打印入口网址如下: https://bm.ruankao.org.cn/sign/welcome 广东的同学特别注意:准考证打印截止时间是11月8号,也就是考试前一天。一定要提前打印准考证,考试当天是无法打印的。 2024年下半年软考准考证…

研究生如何利用ChatGPT帮助开展日常科研工作?

小白可做!全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为当代研究生,科研工作三部曲----读文献、开组会、数据分析。无论哪一个,都令研究生们倍感头疼,简直就是梦魇。每当看到导师发来的消息&a…

LabVIEW机床加工监控系统

随着制造业的快速发展,机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题,开发了一种基于LabVIEW的机床加工监控系统,通过实时监控机床状态,改进生产流程&am…

苹果盛宴:iPhone 16系列领衔,智能穿戴新潮流来袭

在科技界备受瞩目的苹果秋季发布会上,众多新品悉数亮相,从全新的Apple Watch系列到AirPods系列,再到备受期待的iPhone 16系列,每一款产品都以其独特的创新和卓越的性能,再次定义了智能设备的高标准。 本文将带您领略这…

GAN(Generative Adversarial Nets)

GAN(Generative Adversarial Nets) 引言 GAN由Ian J. Goodfellow等人提出,是Ian J. Goodfellow的代表作之一,他还出版了大家耳熟能详的花书(Deep Learning深度学习),GAN主要的思想是同时训练两个模型,生成…

Docker安装mysql8并配置主从复制

1. 安装mysql8 1.1 新增挂载文件 # 新增mysql挂载文件夹 mkdir -p /root/docker/mysql/m01/log mkdir -p /root/docker/mysql/m01/data mkdir -p /root/docker/mysql/m01/conf1.2 新增mysql配置文件 # 新增mysql配置文件 cd /root/docker/mysql/m01/conf vim my.cnf # 下面是…

Electron Vue框架环境搭建 Vue3环境搭建

官方文档 Electron官网 https://www.electronjs.org/ 安装Electron # 如果你没有vue-cli的话需要全局安装 npm install -g vue-cli # 然后使用vue-cli来安装electron-vue的模板 vue init simulatedgreg/electron-vue my-project安装依赖 npm i运行启动 npm run dev以上方法…

JS进阶 3——深入面向对象、原型

JS 进阶3——深入面向对象、原型 1.编程思想 面向过程:分析出解决问题的过程,然后用函数将这些步骤一步步封装起来面向对象:将事物分为一个个对象,然后对象之间分工合作 2.构造函数:封装性、面向对象 构造函数方法存…