机器学习之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]]))

运行结果:

在这里插入图片描述

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

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

相关文章

【VSCode】工作区及设置

【VSCode】工作区及设置 VSCode介绍工作区设置 VSCode介绍 Visual Studio Code(简称VSCode)是一个由微软开发的免费、开源的代码编辑器,以下是VSCode的一些功能及特性: 编辑器核心: 多文档界面:VSCode允许…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT,给大家分享一下操作流程。 一、安装JMeter 参考文档:Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3,用到的插件是:mqtt-xmeter-2.0.2-jar-with-depe…

若依框架中的上传图片后如何实现回显到页面的

在日常开发中,总会遇到上传文件、图片等功能,然后本地开发的话,又没有像OSS、七牛等网络存储,这个时候通常将文件上传到本地,那么上传之后拿到的是本地的路径,存储到数据库中,查询的时候如何将本…

仓颉编程语言的未来何去何从?--探索可持续发展

引言 作为一门具有革命性特点的编程语言,仓颉编程语言凭借自然语言式语法、高效的智能推断能力和多场景适用性,在短时间内赢得了开发者的广泛关注。然而,任何一门语言的发展都伴随着机遇与挑战。仓颉虽然在多个领域表现出了强大的能力&#…

Linux 文件 I/O 基础

目录 前言 一、文件描述符(File Descriptor) 二、打开文件(open 函数) 三、读取文件(read 函数) 四、写入文件(write 函数) 五、关闭文件(close 函数) …

【CSS in Depth 2 精译_091】15.4:让 CSS 高度值过渡到自动高度 + 15.5:自定义属性的过渡设置(全新)+ 15.6:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 15.2.1 定制贝塞尔曲线15.2.2 阶跃 15.3 非动画属性 15.3.1 不可添加动画效果的属性15.3.2 淡入与淡出 15.4 过…

路由器的原理

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 路由器的原理一,路由器基础及相关…

硬件设计:LVDS电平标准

什么是LVDS? LVDS(Low-Voltage Differential Signaling)是一种高速、低功耗的差分信号传输标准。它通过一对差分信号线(通常是两根互补信号线)来传输数据,广泛应用于高速数字通信领域。 LVDS 的核心特点 低…

spring专题笔记(七):spring如何引入外部属性文件?spring在xml配置bean时如何引入外部的properties属性文件内容?

目录 1、spring在xml配置bean时引入外部的properties属性文件内容作用是什么? 2、引入配置文件步骤 2.1、首先创建一个java类MyDataSource,主要包含四个属性。 2.2、准备一个myDataConfig.properties属性文件,里面配置MyDataSource类中需…

梳理你的思路(从OOP到架构设计)_认识框架(Framework) 01

目录 1、 是框架的核心要素​编辑&i> 范例1&#xff1a; 范例2&#xff1a; 范例3&#xff1a; 1、 <E&I>是框架的核心要素 在特定领域(Domain)里&#xff0c;将EIT造形的<E&I>部份有意义地组合起来&#xff0c;就成为框架(Framework)了。基本…

邮件白名单是什么?

邮件白名单是一种电子邮件过滤规则&#xff0c;用于指定哪些发件人、域名或IP地址的邮件被允许通过过滤系统&#xff0c;不受任何限制地进入收件人的邮箱。与黑名单&#xff08;用于阻止特定发件人的邮件&#xff09;相反&#xff0c;白名单确保了来自受信任来源的邮件能够畅通…

Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中&#xff0c;可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe&#xff0c;但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe&#xff0c;比如&#xff1a; 因为不需要经常运行 OpenRewrite&#xff0c;所以不想在pom.xml 加入不常使用的插件…

JVM实战—2.JVM内存设置与对象分配流转

大纲 1.JVM内存划分的原理细节 2.对象在JVM内存中如何分配如何流转 3.部署线上系统时如何设置JVM内存大小 4.如何设置JVM堆内存大小 5.如何设置JVM栈内存与永久代大小 6.问题汇总 1.JVM内存划分的原理细节 (1)背景引入 (2)大部分对象的存活周期都是极短的 (3)少数对象…

外部化内部类

要定义一个新的名字空间&#xff0c;将一个类内部的类提到外部&#xff0c;目的是降低类的耦合度和复杂度&#xff0c;这通常可以通过 外部化内部类 来实现。通过这种方式&#xff0c;可以将复杂的实现细节分离到一个单独的名字空间中&#xff0c;让外部类的接口保持简洁。接下…

创建仓颉编程语言的第一个项目

创建仓颉编程语言的第一个项目 安装仓颉编程语言编译器第一个仓颉项目 安装仓颉编程语言编译器 安装仓颉编程语言编译器&#xff0c;是一个需要非常强的动手能力的过程——有大量的命令行操作。这不是仓颉编程语言独有的特点。现在流行的编程语言&#xff0c;比如 kotlin、jav…

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…

计算机网络:IP地址相关知识总结

目录 一、IP地址的表现形式 1.1 十进制表示形式 1.2 二进制表示形式 1.3 转换示例介绍 二、IP地址的组成 2.1 网络ID 2.2 主机ID 2.3 示例 三、IP地址的分类 3.1 A类地址 3.2 B类地址 3.3 C类地址 3.4 D类地址 3.5 E类地址 四、常见的特殊IP地址 五、IP地址二进…

基础练习 Huffman树,C++,最小堆,STL

Description Huffman树在编码中有着广泛的应用。在这里&#xff0c;我们只关心Huffman树的构造过程。 给出一列数{pi}{p0, p1, …, pn-1}&#xff0c;用这列数构造Huffman树的过程如下&#xff1a; 1. 找到{pi}中最小的两个数&#xff0c;设为pa和pb&#xff0c;将pa和pb从{…

Java获取自身被调用点

1. 场景 打印日志的时候&#xff0c;需要获取是在哪个地方被调用了&#xff0c;把调用点的信息一并打印出来。 2. 获取自身被调用点的方法 可以通过获取线程的调用栈&#xff0c;遍历后找到调用点。 3. 代码实现 import java.text.SimpleDateFormat; import java.util.Dat…