[机器学习]KNN算法

news2024/11/25 0:57:51

1 KNN算法简介

  • KNN算法思想:如果一个样本在特征空间中的K个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。

  • K值过小:用较小领域中的训练实例进行预测。
    • 容易受到异常点的影响
    • K值的减小意味着整体模型变得复杂,容易发生过拟合
  • K值过大:用较大邻域中的训练实例进行预测。
    • 受到样本均衡的的问题
    • K值的增大意味着整体的模型变得简单,欠拟合

  • K值调优的方法:交叉验证、网格搜索;选择奇数,不要选择类别个数的整数倍;5,7()
  • 分类问题&回归问题

2 KNN算法API实现

from sklearn.neighbors import KNeighborsClassifier

def dm01_knnapi_classifier():
    estimator=KNeighborsClassifier(n_neighbors=1)
    X=[[0],[1],[2],[3]]
    y=[0,0,1,1]
    estimator.fit(X,y)
    myret=estimator.predict([[4]])
    print('myret->',myret)

dm01_knnapi_classifier()

 

from sklearn.neighbors import KNeighborsRegressor
def dm02_knnapi_regressor():
    estimator=KNeighborsRegressor(n_neighbors=2)
    X=[[0,0,1],
       [1,1,0],
       [3,10,10],
       [4,11,12]]
    y=[0.1,0.2,0.3,0.4]
    estimator.fit(X,y)
    myret=estimator.predict([[3,11,10]])
    print('myret->',myret)
dm02_knnapi_regressor()

3 距离度量

3.1 欧氏距离(MSE,L2)

3.2 曼哈顿距离(MAE,L1)

  • 也称“城市街区距离”,曼哈顿城市特点:横平竖直。

3.3 切比雪夫距离(Chebyshev Distance)

3.4 闵可夫斯基距离(Minkowski Distance)

4 特征预处理

  • 归一化易受异常值影响
  • 自然界中数据符合高斯分布

# 归一化
from sklearn.preprocessing import  MinMaxScaler
def dm01_MinMaxScaler():
    data=[
        [90,2,10,40],
        [60,4,15,45],
        [75,3,13,46]
    ]
    # 初始化归一化对象
    transform=MinMaxScaler()
    # 对原始特征进行变换
    # data=transformer.fit_transform(data)
    # 求最大值、最小值
    transform.fit(data)
    data=transform.transform(data)
    print(data)
dm01_MinMaxScaler()

# 标准化
from sklearn.preprocessing import StandardScaler
def dm03_StandardScale():
    data=[
        [90,2,10,40],
        [60,4,15,45],
        [75,3,13,46]
    ]
    # 初始化标准化对象
    transformer=StandardScaler()
    
    # 对原始特征进行变换
    data=transformer.fit_transform(data)
    # 打印归一化后的结果
    print(data)
    # 打印每一列数据的均值和标准差
    print('transfer.mean-->',transformer.mean_)
    print('transfer.var-->',transformer.var_)
dm03_StandardScale()

5 [案例]Iris分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 加载数据集
dataset = load_iris()

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(
    dataset.data, dataset.target, test_size=0.2, random_state=0
)

# 数据标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 模型训练
knn = KNeighborsClassifier()

# 使用交叉验证网格搜索进行超参数调优
knn = GridSearchCV(estimator=knn, param_grid={'n_neighbors': [1, 3, 5, 7]}, cv=5)
knn.fit(x_train, y_train)
print('knn.best_estimator_ --->', knn.best_estimator_)

# 模型评估
knn_score = knn.score(x_test, y_test)
print('knn_score --->', knn_score)

# 模型预测
new_data = [[0.5, 1.2, 2.4, 5.2]]
new_data = transfer.transform(new_data)
print('预测值为 --->', knn.predict(new_data))
print('预测结果概率分布 --->', knn.predict_proba(new_data))

 

6 超参数选择方法

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 加载数据集
dataset = load_iris()

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(
    dataset.data, dataset.target, test_size=0.2, random_state=0
)

# 数据标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 模型训练
knn = KNeighborsClassifier()

# 使用交叉验证网格搜索进行超参数调优
knn = GridSearchCV(estimator=knn, param_grid={'n_neighbors': [1, 3, 5, 7]}, cv=5)
knn.fit(x_train, y_train)
print('knn.best_estimator_ --->', knn.best_estimator_)

# 模型评估
knn_score = knn.score(x_test, y_test)
print('knn_score --->', knn_score)

# 模型预测
new_data = [[0.5, 1.2, 2.4, 5.2]]
new_data = transfer.transform(new_data)
print('预测值为 --->', knn.predict(new_data))
print('预测结果概率分布 --->', knn.predict_proba(new_data))

7 [案例]手写数字识别

import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler,MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
import joblib
import matplotlib.pyplot as plt

# 加载数据
dataset = pd.read_csv('手写数字识别.csv')

# 分割数据集
x = dataset.iloc[:, 1:].values
y = dataset.iloc[:, 0].values
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, stratify=y, random_state=0
)

# 数据归一化
transfer = MinMaxScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 模型训练
knn = KNeighborsClassifier()

# 使用交叉验证网格搜索进行超参数调优
knn = GridSearchCV(estimator=knn, param_grid={'n_neighbors': [3, 5, 7]}, cv=5)
knn.fit(x_train, y_train)
print('knn.best_estimator_', knn.best_estimator_)

# 模型评估
acc = knn.score(x_test, y_test)
print('acc', acc)

# 模型保存
joblib.dump(knn, 'knn.pth')

# 加载模型
knn = joblib.load('knn.pth')

# 读取图片(自动用归一化)
img = plt.imread('demo.png')

# 图片数据处理
img_data = img.reshape(1, -1)
img_pred = knn.predict(img_data)
print('img_pred', img_pred) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tableau学习日记

Day1:Tableau简介、条形图与直方图 1.Tableau绘制条形图 1.1 条形图1:各地区酒店数量 1.2 条形图2:各地区酒店均价 1.3 堆积图:价格等级堆积图 2.Tableau绘制直方图 2.1创建评分直方图 Day2:Tableau简介、条形图与直…

c# resource en-US

这里主要是做中英文语言包切换的,非常简单

Java教程:SE进阶【十万字详解】(上)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

c++11新特性——endable_shared_from_this

文章目录 一.解决场景代码示例原因 二.解决办法代码 三.底层原理 一.解决场景 一个share_ptr管理的类&#xff0c;如果从类的函数里返回类对象&#xff08;this指针&#xff09;&#xff0c;导致share_ptr引用计数错误&#xff0c;析构时异常问题 代码示例 #include <mem…

最近试用了FunHPC-AI宝箱-ComfyUI-Plus,使用了dreamshaperXL全能模型,生成了几张国风图,效果真的让人惊叹!

最近试用了FunHPC-AI宝箱-ComfyUI-Plus&#xff0c;使用了dreamshaperXL全能模型&#xff0c;生成了几张国风图&#xff0c;效果真的让人惊叹&#xff01;&#x1f338; https://www.funhpc.com/#/ 通过简单的提示词&#xff0c;我就能轻松生成出充满古韵的图像&#xff1a;汉服…

linux查看外网ipv4地址

在Linux系统中&#xff0c;可以使用以下几种方法来查看外网IPv4地址&#xff0c;并确保强制使用IPv4。 前言 特别感谢浪浪云对本文的大力支持。浪浪云作为领先的云计算服务提供商&#xff0c;凭借其卓越的性能和可靠性&#xff0c;帮助无数企业和开发者实现了业务的快速部署和…

苹果宣布iOS 18正式版9月17日推送:支持27款iPhone升级

9月10日消息&#xff0c;在苹果秋季发布会结束后&#xff0c; 苹果宣布将于9月17日(下周二)推送iOS 18正式版系统。 苹果官网显示&#xff0c;iOS 18正式版将兼容第二代iPhone SE及之后的所有机型&#xff0c;加上刚发布的iPhone 16系列&#xff0c;共兼容27款iPhone。 iOS 18升…

为拖延症量身定制的AI工具,让Kimi做我的《每日信息整理助手》

AI不止对传统行业带来巨大的改变&#xff0c;对日常生活也便利了不少&#xff0c;现在这个时代获取信息的方式太简单了。 我们每天都会接受大量的信息&#xff0c;难免一天下来会忘记很多事情&#xff0c;有时候突然想起了一个点子&#xff0c;有时候突然有一件急事、一件待办事…

基于SpringBoot+Vue的校园失物招领系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的校园失物…

2024年黑龙江事业单位考试报名保姆级流程

黑龙江事业编考试报名须知 一、报名安排 1.报名时间&#xff1a;9月18日9&#xff1a;00-9月24日17&#xff1a;00 2.报名网址&#xff1a;黑龙江省事业单位公开招聘服务平台 二、报名操作流程 本次招考采取网上报名的方式。 1.网上报名。应聘人员可于2024年9月18日9&…

企业数字化转型、建设和升级面临的主要难题和解决之道(2)

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

总结拓展九:SAP数据迁移(1)

第一节&#xff1a;数据迁移介绍 1、SAP上线前MM模块需要迁移的数据 1.1 静态数据&#xff1a;物料主数据、供应商主数据等&#xff1b; 1.2 业务数据&#xff1a;采购订单&#xff08;未收货&#xff09;、发票校验&#xff08;未校验&#xff09;、采购信息记录、货源清单…

如何使用python运行Flask开发框架并实现无公网IP远程访问

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程语…

【数据结构与算法 | 灵神题单 | 快慢指针(链表)篇】力扣876, 2095, 234

1. 力扣876&#xff1a;链表的中间节点 1.1 题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,…

pdf删除一页怎么删除?5种方法详细讲解,pdf删除页面实用技巧分享!

pdf删除一页怎么删除&#xff1f;从pdf文档中删除某页是一项非常实用的技术&#xff0c;特别是在需要编辑pdf文件时。在某些情况下&#xff0c;您可能需要删除页面以保护机密信息、去除不必要的内容&#xff0c;或者为了压缩pdf文件的大小。因此&#xff0c;掌握有效且简单的删…

搭建线上扭蛋机小程序,企业新的盈利模式?

近几年&#xff0c;随着市场对潮玩商品的需求不断增加&#xff0c;越来越多的资本入局到潮玩市场&#xff0c;因此&#xff0c;扭蛋机也开始在市场中持续走红&#xff0c;扭蛋机的各种创新玩法&#xff0c;也刺激着消费者的购买欲望&#xff0c;推动市场的发展。 扭蛋机的目标…

Java面试题下

Java面试题下 异常 Exception和Error有什么区别 所有的异常都有一个共同的祖先Throwable类。有两者子类: Exception:程序可以本身处理的异常&#xff0c;可通过catch来捕获。Exception 又可以分为 Checked Exception (受检查异常&#xff0c;必须处理) 和 Unchecked Excepti…

chapter14-集合——(List-HMap)——day18

目录 536-HMap阶段小结 537-HMAp底层机制 538-HMAP源码解读 539-HMap扩容树化触发 重点在于hashmap的扩容机制 它内部是k-v对方式存储数据&#xff0c;Hash$node类型&#xff1b;相同的key&#xff0c;就会覆盖 Hash$node类型实现了mapentry接口 扩容条件&#xff0c;看是否…

【在Linux世界中追寻伟大的One Piece】五种IO模型和阻塞IO

目录 1 -> 五种IO模型 1.1 -> 阻塞IO(Blocking IO) 1.2 -> 非阻塞IO(Non-blocking IO) 1.3 -> 信号驱动IO(Signal-Driven IO) 1.4 -> IO多路转接(IO Multiplexing) 1.5 -> 异步IO(Asynchronous IO) 2 -> 高级IO概念 2.1 -> 同步通信VS异步通信…

鸿蒙介绍、鸿蒙编程环境、基本组件、页面跳转学习

系列文章目录 第一章 鸿蒙介绍、鸿蒙编程环境、基本组件、页面跳转学习 文章目录 系列文章目录前言一、HarmonyOS基础1. 鸿蒙系统是什么&#xff1f;2. 鸿蒙系统的重要目录及文件 二、HarmonyOS编程介绍1. ArkTS编程语言介绍2. DevEco Studio编程环境介绍3. 关系介绍 三、使用…