机器学习之KNN算法预测数据和数据可视化

机器学习及KNN算法

目录

  • 机器学习及KNN算法
    • 机器学习基本概念
      • 概念理解
      • 步骤
      • 为什么要学习机器学习
      • 需要准备的库
    • KNN算法
      • 概念
      • 算法导入
      • 常用距离公式
      • 算法优缺点
        • 优点:
        • 缺点︰
    • 数据可视化
      • 二维界面
      • 三维界面
    • KNeighborsClassifier 和KNeighborsRegressor理解
      • 查看KNeighborsRegressor函数参数定义
      • 查看 KNeighborsClassifier函数参数定义
      • 参数理解
      • 使用格式
    • 预测类别实际应用
      • 问题
      • 特征数据
      • 类别标签
      • 问题理解
      • 可视化数据理解
      • 数据预测
    • 预测数值实际应用

机器学习基本概念


概念理解

利用数学中的公式 总结出数据中的规律。

步骤

  1. 数据收集
    数据量越大,最终训练的结果越正确
  2. 建立数学模型训练
    针对不同的数据类型需要选择不同的数学模型
  3. 预测
    预测数据

为什么要学习机器学习

  • 信息爆炸时代,数据量太大,人工已经无法处理。
  • 重复性的工作交给电脑来做。
  • 潜在一些信息之间的关联人类不容易直接发现。
  • 机器学习确实有效的解决很多问题。
    等…

需要准备的库

  • numpy
  • scipy
  • matplotlib
  • pandas
  • sklearn
    Sklearn (Scikit-Learn) 是基于 Python 语言的第三方机器学习库。它建立在 NumPy, SciPy, Pandas 和 Matplotlib库 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。我使用的是1.0.2版本,可在终端下载
    代码展示:

未修改pip下载源的,后面需添加 -i 镜像源地址

pip install scikit_learn==1.0.2

KNN算法


概念

全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。
如果求得是值,则求其平均值为结果,如果是确定类别,则比较多的类别为结果。

算法导入

  • KNeighborsClassifier 预测类别
  • KNeighborsRegressor 预测值
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsRegressor

常用距离公式

  • 欧式距离:

    • 二维空间:a点为(x1,y1),b点为(x2,y2)在这里插入图片描述
    • 三维空间:a点为(x1,y1 ,z1),b点为(x2,y2 ,z2)
      -
    • n维空间:a点为(x11,x12 ,…,x1n),b点为(x21,x22,…,x2n)
      在这里插入图片描述
  • 曼哈顿距离:

    • 二维空间:a点为(x1,y1),b点为(x2,y2)
      在这里插入图片描述

    • n维空间:a点为(x11,x12 ,…,x1n),b点为(x21,x22,…,x2n)
      在这里插入图片描述

算法优缺点

优点:

1.简单,易于理解,易于实现,无需训练;
2.适合对稀有事件进行分类;
3.对异常值不敏感。

缺点︰

1.样本容量比较大时,计算时间很长;
⒉.不均衡样本效果较差;

数据可视化


二维界面

格式:

  • figure(“窗口名”)
    创建空白画板
  • axes()
    确认维度,默认二维
  • scatter(x,y,c=“十六进制颜色值”,marker=“标识图案”)
    设置为散点图,同时确认数据及数据显示颜色和标识图案,x,y可以是数值也可以是数组
  • set(xlabel=“x”,ylabel=“y”)
    设置坐标轴名称,x,y可以改为需要的坐标轴名
    代码展示:
import matplotlib.pyplot as plt
a = [1,2,3,4]
# 建立空白画板
fig = plt.figure("二维")
#确认维度,默认二维
b = plt.axes()
# 数据可以是数值也可以是数组
b.scatter(2,3,c="#00F5FF",marker="o")
b.scatter(a,a,c="#00FF7F",marker="*")
b.set(xlabel="x",ylabel="y")
plt.show()

运行结果:
在这里插入图片描述

三维界面

格式:

  • figure(“窗口名”)
    创建空白画板
    • axes(projection=“3d”)
      设置三维
    • scatter(x,y,z,c=“十六进制颜色值”,marker=“标识图案”)
      确认数据及数据显示颜色和标识图案,x,y,z可以是数值也可以是数组
  • set(xlabel=“x”,ylabel=“y”,zlabel=“z”)
    设置坐标轴名称,x,y,z可以改为需要的坐标轴名

代码展示:

a = [1,2,3,4]
data = np.loadtxt('dating_TS.txt')
figure = plt.figure("三维")
b = plt.axes(projection="3d")
b.scatter(2,3,4,c="#00F5FF",marker="o")
b.scatter(a,a,a,c="#00FF7F",marker="*")
b.set(xlabel="x",ylabel="y",zlabel="z")
plt.show()

运行结果:
在这里插入图片描述

KNeighborsClassifier 和KNeighborsRegressor理解


查看KNeighborsRegressor函数参数定义

按住CTRL,鼠标点击函数可自动跳转
部分代码展示:

    def __init__(
        self,
        n_neighbors=5,
        *,
        weights="uniform",
        algorithm="auto",
        leaf_size=30,
        p=2,
        metric="minkowski",
        metric_params=None,
        n_jobs=None,
    )

查看 KNeighborsClassifier函数参数定义

部分代码展示:

def __init__(
        self,
        n_neighbors=5,
        *,
        weights="uniform",
        algorithm="auto",
        leaf_size=30,
        p=2,
        metric="minkowski",
        metric_params=None,
        n_jobs=None,
    )

参数理解

  • n_neighbors
    k值,邻居的个数,默认为5
    。【关键参数】
  • weights : 权重项,默认uniform方法。
    • Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
    • Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
    • Callable:用户自定义权重。
  • algorithm :用于计算最近邻的算法。
    • ball_tree:球树实现
    • kd_tree:KD树实现, 是一种对n维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
    • brute:暴力实现
    • auto:自动选择,权衡上述三种算法。【一般按自动即可】
      leaf_size :空值KD树或者球树的参数,停止建子树的叶子节点的阈值。
  • p : 距离的计算方式。P=1为曼哈顿距离,p=2为欧式距离
    1.曼哈顿距离2.欧式距离3.切比雪夫距离4.闵可夫斯基距离5.带权重闵可夫斯基距离
    6.标准化欧式距离7.马氏距离
  • metric : 用于树的距离度量
    “euclidean” EuclideanDistance - sqrt(sum((x - y)^2))
    “manhattan” ManhattanDistance - sum(|x - y|)
    “chebyshev” ChebyshevDistance - max(|x - y|)
    “minkowski” MinkowskiDistance p, w sum(w * |x - y|^p)^(1/p)
    “wminkowski” WMinkowskiDistance p, w sum(|w * (x - y)|^p)^(1/p)
    “seuclidean” SEuclideanDistance V sqrt(sum((x - y)^2 / V))
    “mahalanobis” MahalanobisDistance V or VI ``sqrt((x - y)’ V^-1 (x - y))
  • metric_params :用于比较复杂的距离的度量附加参数。【用不上】

使用格式

  • x = data1 特征数据
  • y = data2 结果(平均值/较多类别)
  • n = KNeighborsClassifier(n_neighbors=7,p=1,metric=“euclidean”)
    确定最近个数为7,和距离计算方式1曼哈顿距离,树的距离方式是欧式距离
  • n.fit(x,y)
    自带的训练模型,自动按上方设置计算判断
  • n.predict(二维数组)
    预测二维数组的结果

预测类别实际应用


问题

现在有很多大学里出现室友矛盾,假如室友可以选择: 大学里面 ,对于校方,把类型相同的学生放在一个寝室,在基于大二大三大四的,现已存在一个数据文件datingTestSet2.txt ,为历年大学生的调查问卷表。

特征数据

第1列:每年旅行的路程
第2列:玩游戏所有时间百分比
第3列:每个礼拜消 零食

类别标签

1表示爱学习,2表示一般般,3表示爱玩,目的为学生在大学中挑选室友的信息

datingTestSet2.txt 部分数据展示:
在这里插入图片描述

问题理解

根据最近距离的k个距离最近的类别标签来预测要确定如有[1500,0.924729,0.2134935]特征数据的学生的类别标签,进而分寝室。
注意点:最近距离是由三列特征数据来计算,结果是类别,需要使用的是KNeighborsClassifier

可视化数据理解

data[:,-1] 索引数据最后一列
data[:,-1] ==1 判断为类别1为T,否则为F,结果是bool值
data[data[:,-1]==1] 根据判断归类各个类别数据
data_1[:,0],data_1[:,1],data_1[:,2] 分别为第1,2,3列特征数据
由颜色表示类别3种

调试查看数据data
在这里插入图片描述
data[:,-1]
在这里插入图片描述
data[:,-1] ==1
在这里插入图片描述
data[data[:,-1]==1]
在这里插入图片描述

代码展示:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
data = np.loadtxt('dating_TS.txt')
data_1 = data[data[:,-1]==1]
data_2 = data[data[:,-1]==2]
data_3 = data[data[:,-1]==3]
a_d = data[:,-1]
a_d_1 = [data[:,-1]==1]
fig = plt.figure()
a = plt.axes(projection="3d")
a.scatter(data_1[:,0],data_1[:,1],data_1[:,2],c="#00F5FF",marker="o")
a.scatter(data_2[:,0],data_2[:,1],data_2[:,2],c="#00FF7F",marker="o")
a.scatter(data_3[:,0],data_3[:,1],data_3[:,2],c="#000080",marker="o")
a.set(xlabel="x",ylabel="y",zlabel="z")
plt.show()

运行结果:
在这里插入图片描述

数据预测

代码展示:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsRegressor
data = np.loadtxt('dating_TS.txt')
x = data[: , :-1]
y = data[: , -1]
n = KNeighborsClassifier(n_neighbors=7,p=1)
n.fit(x,y)
print(n.predict([[1500,0.924729,0.2134935]]))
p_data = [[1234,2.4567,0.5467],
          [123435,8.2134,2.345],
          [5668,3.6754,0.34567]
]
print(n.predict(p_data))
n1 = KNeighborsClassifier(n_neighbors=3,p=2,metric="euclidean")
n1.fit(x,y)
print(n1.predict([[1500,0.924729,0.2134935]]))
p_data = [[1234,2.4567,0.5467],
          [123435,8.2134,2.345],
          [5668,3.6754,0.34567]
]
print(n1.predict(p_data))

运行结果:
在这里插入图片描述

预测数值实际应用

给定房屋特征和价格数据,最后一列为价格,来根据历史数据预测价格
部分房屋特征和价格数据展示:

在这里插入图片描述

代码展示:

import numpy as np
from sklearn.neighbors import KNeighborsRegressor
data_f = np.loadtxt('data_f1.txt')
x = data_f[:,:-1]
y = data_f[:,-1]
n = KNeighborsRegressor(n_neighbors=7,p=2,metric="euclidean")
n.fit(x,y)
print(n.predict([[ 2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24,666.0,20.21,392.93,10.42]]))
n1 = KNeighborsRegressor(n_neighbors=5,p=2,metric="euclidean")
n1.fit(x,y)
print(n1.predict([[ 2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24, 666.0,20.21,392.93,10.42]]))

运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需配置设备,借助GitHub快速编译项目并直接运行!

引言 你是否曾经有过类似的烦恼,发现了一个有趣的项目,想要测试一下,但是自己的设备没有对应的开发环境或者受制于自己的设备,不想或者不能去配置对应的开发环境,应该怎么办呢?这种情况下,其实…

【C++11】类型分类、引用折叠、完美转发

目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后,进一步对类型进行了划分,右值被划分纯右值(pure value,简称prvalue)和将亡值 (expiring value,简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…

k-Means聚类算法 HNUST【数据分析技术】(2025)

1.理论知识 K-means算法,又称为k均值算法。K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。K-Means算法接受参数K;然后将…

阿里云redis内存优化——PCP数据清理

在阿里云安装了一个redis节点,今天使用时忽然想着点击了一下分析内存。好家伙,居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊,怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度,研究了下这个问题的来源。网上…

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图,后端显示请求成功,前端显示失败 解决方案 1. 后端未配置跨域支持 …

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式) 本文目录: 零、时光宝盒🌻 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒🌻 &a…

akamai3.0 wizzair 网站 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…

kubernetes Gateway API-1-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…

likeAdmin架构部署(踩坑后的部署流程

1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven:>3.8 ❤️.9 (最好不要3.9已经试过失败 node :node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK:JDK8 node 需要换源 npm c…

宠物行业的出路:在爱与陪伴中寻找增长新机遇

在当下的消费市场中,如果说有什么领域能够逆势而上,宠物行业无疑是一个亮点。当人们越来越注重生活品质和精神寄托时,宠物成为了许多人的重要伴侣。它们不仅仅是家庭的一员,更是情感的寄托和生活的调剂。然而,随着行业…

Java 堆排序原理 图文详解 代码逻辑

文章目录 1. 时间复杂度 & 空间复杂度2. 大顶堆、小顶堆3. 具体步骤 & 原理1. 判断是否满足堆的性质2. 维护堆的性质3. 交换位置 4. 代码实现 1. 时间复杂度 & 空间复杂度 时间复杂度: O(nlogn) 建堆时间复杂度: O(n) 排序时间复杂度: O(nlogn)空间复杂度: O(1) …

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…

ensp、HCL环境部署vm版

ensp、HCL环境部署vm版 前言部署环境vmware安装下载镜像创建虚拟机安装ensp、HCL创建快照 问题此平台不支持虚拟化的 AMD-V/rvi。 前言 因为我换了电脑,锐龙版的win11,我按照以前的思路去装软件,发现有很多问题,特别是跳hyper-v弹…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目,前面的内容已使用云函数,云数据库分别实现云捐助项目首页中的项分类导航,底部导航,轮播图功能,这里继续实现云数据库加载捐赠…

【LeetCode: 83. 删除排序链表中的重复元素 + 链表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Spring源码_05_IOC容器启动细节

前面几章,大致讲了Spring的IOC容器的大致过程和原理,以及重要的容器和beanFactory的继承关系,为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的,接下来的每一章都是从总体脉络中, 去研究之前没看的一些重要…

2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。

文章目录 sklearn学习(25) 无监督学习-神经网络模型(无监督)25.1 限制波尔兹曼机25.1.1 图形模型和参数化25.1.2 伯努利限制玻尔兹曼机25.1.3 随机最大似然学习 sklearn学习(25) 无监督学习-神经网络模型(无监督) 文章参考网站&a…

BUG分析 - 重启有时失败

1. 倒查版本 1.0_11 - ok1.0_12 - fail 2.对比1.0_11和1.0_12 失败时的日志 ================================== 1.0_11 ============================== 2024-12-26 09:46:51.886 INFO [26332] [ThreadPLCPool::in

git注意事项

提交代码的备注 feat : 开发 新增功能 fix: 修复 git相关 1. git安装及全局用户设置 Git安装 npm install git -ggit修改用户名邮箱密码 git config --global --replace-all user.name "要修改的用户名" git config --global --replace-all user.email"要修改…

LeetCode每日三题(六)数组

一、最大子数组和 自己答案: class Solution {public int maxSubArray(int[] nums) {int begin0;int end0;if(numsnull){//如果数组非空return 0;}else if(nums.length1){//如果数组只有一个元素return nums[0];}//初值选为数组的第一个值int resultnums[0];int i…