当前位置: 首页 > news >正文

K近邻算法_分类鸢尾花数据集

import numpy as np
import pandas as pd 
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

1.数据预处理

iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# 分类标签数据
df['class'] = iris.target
# 数值转为文字
df['class'] = df['class'].map({0: iris.target_names[0], 1: iris.target_names[1], 2: iris.target_names[2]})
df.head()
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)class
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
x = iris.data
y = iris.target.reshape(-1, 1)
print("x shape: " , x.shape)
print("y shape: ", y.shape)
x shape:  (150, 4)
y shape:  (150, 1)
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y,test_size=0.3, random_state=42, stratify=y)

2. 模型实现

# L1 距离
def l1_distance(a, b):return np.sum(np.abs(a - b), axis = 1)#L2 距离
def l2_distance(a, b):return np.sqrt(np.sum((a - b)**2, axis = 1))# K近邻模型
class KnnModel(object):def __init__(self, k_neighbors = 1, distance_func = l1_distance):self.k_neighbors = k_neighbors;self.distance_func = distance_func#不需要训练,只是预测时用于计算预测点的距离def fit(self, x, y):self.x_train = xself.y_train = ydef predict(self, test):y_predict = np.zeros((test.shape[0],1), dtype=self.y_train.dtype)for i, x_test in enumerate(test):# 计算 测试点和训练集的距离distances = self.distance_func(self.x_train, x_test)# 按照距离大小排序,取出索引sort_index = np.argsort(distances)# 取出前 k 个值neighbors_predict = self.y_train[sort_index[:self.k_neighbors]].ravel()# 取出前 k 个值里面出现最多的数y_predict[i] = np.argmax(np.bincount(neighbors_predict))return y_predict

3.测试

knn = KnnModel(k_neighbors = 9)
knn.fit(x_train, y_train);result_list = []
for df in [1, 2]:knn.distance_func = l1_distance if pd == 1 else l2_distancefor k in range(1, 20 , 2):knn.k_neighbors = ky_predict = knn.predict(x_test)acc = accuracy_score(y_test, y_predict) * 100result_list.append([k, 'l1_dist' if df == 1 else 'l2_dist', acc])result_df = pd.DataFrame(result_list, columns=['k', '距离函数', '准确率'])
print(result_df)
     k     距离函数        准确率
0    1  l1_dist  93.333333
1    3  l1_dist  95.555556
2    5  l1_dist  97.777778
3    7  l1_dist  95.555556
4    9  l1_dist  95.555556
5   11  l1_dist  93.333333
6   13  l1_dist  93.333333
7   15  l1_dist  95.555556
8   17  l1_dist  95.555556
9   19  l1_dist  95.555556
10   1  l2_dist  93.333333
11   3  l2_dist  95.555556
12   5  l2_dist  97.777778
13   7  l2_dist  95.555556
14   9  l2_dist  95.555556
15  11  l2_dist  93.333333
16  13  l2_dist  93.333333
17  15  l2_dist  95.555556
18  17  l2_dist  95.555556
19  19  l2_dist  95.555556
http://www.lryc.cn/news/437775.html

相关文章:

  • nacos和eureka的区别详解
  • AI大模型包含哪些些技术?
  • 分布式技术概览
  • 动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习
  • Nacos rce-0day漏洞复现(nacos 2.3.2)
  • yjs04——matplotlib的使用(多个坐标图)
  • MOS管和三极管有什么区别?
  • 医院多参数空气质量监控和压差监测系统简介@卓振思众
  • [项目实战]EOS多节点部署
  • setImmediate() vs setTimeout() 在 JavaScript 中的区别
  • 【Java文件操作】文件系统操作文件内容操作
  • 关于若依flowable的安装
  • 猜数字困难版(1-10000)
  • ASPICE术语表
  • Knife4j:打造优雅的SpringBoot API文档
  • 数学建模笔记—— 多目标规划
  • 【鸿蒙HarmonyOS NEXT】页面之间相互传递参数
  • SonicWall SSL VPN曝出高危漏洞,可能导致防火墙崩溃
  • 关于SAP标准委外(带料外协)采购订单信息
  • SpringBoot整合WebSocket实现消息推送或聊天功能示例
  • 使用 QEMU 模拟器运行 FreeRTOS 实时操作系统
  • Oracle EBS中AR模块的财务流程概览
  • Minitab 的直方图结果分析解释
  • AgentRE:用智能体框架提升知识图谱构建效果,重点是开源!
  • 力扣题解2390
  • 用Python获取PDF页面的大小、方向和旋转角度
  • 【即时通讯】轮询方式实现
  • Flock 明牌空投教程
  • 项目内部调用的远程接口开发
  • 影响IP代理池稳定性的因素有哪些?