机器学习knnlearn2

server/2025/3/31 12:12:36/
# 导入必要的库
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties# 函数说明:打开并解析文件,对数据进行分类:1代表不喜欢,2代表魅力一般,3代表极具魅力
def file2matrix(filename):try:# 以只读模式打开指定文件with open(filename, 'r') as fr:# 读取文件的所有行,存储为一个列表,列表中的每个元素是文件的一行arrayOLines = fr.readlines()# 计算文件的行数numberOfLines = len(arrayOLines)# 创建一个全零的NumPy矩阵,行数为文件的行数,列数为3,用于存储解析后的数据returnMat = np.zeros((numberOfLines, 3))# 初始化一个空列表,用于存储分类标签classLabelVector = []# 初始化行索引为0,用于遍历文件的每一行index = 0# 遍历文件的每一行for line in arrayOLines:# 去除每行首尾的空白字符(如换行符、制表符、空格等)line = line.strip()# 使用制表符 '\t' 作为分隔符,将每行字符串分割成一个列表listFromLine = line.split('\t')# 将分割后列表的前三个元素赋值给 returnMat 矩阵的当前行,即存储特征数据returnMat[index, :] = listFromLine[0:3]# 根据分割后列表的最后一个元素进行分类if listFromLine[-1] == 'didntLike':# 如果最后一个元素是 'didntLike',则将标签 1 添加到分类标签列表中,表示不喜欢classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':# 如果最后一个元素是 'smallDoses',则将标签 2 添加到分类标签列表中,表示魅力一般classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':# 如果最后一个元素是 'largeDoses',则将标签 3 添加到分类标签列表中,表示极具魅力classLabelVector.append(3)# 行索引加1,处理下一行index += 1# 返回特征矩阵和分类标签列表return returnMat, classLabelVectorexcept FileNotFoundError:# 如果文件未找到,打印错误信息print(f"文件 {filename} 未找到,请检查文件路径。")# 返回 None 表示读取失败return None, Noneexcept Exception as e:# 如果发生其他异常,打印异常信息print(f"读取文件时发生错误: {e}")# 返回 None 表示读取失败return None, None# 函数说明:可视化数据
def showdatas(datingDataMat, datingLabels):# 如果特征矩阵或分类标签列表为 None,说明文件读取失败,直接返回if datingDataMat is None or datingLabels is None:return# 设置字体属性,使用宋体,字号为 14,用于显示中文font = FontProperties(family='SimSun', size=14)# 创建一个 2 行 2 列的子图布局,不共享 x 轴和 y 轴,画布大小为 13x8 英寸fig, axs = plt.subplots(nrows=2, ncols=2, sharex=False, sharey=False, figsize=(13, 8))# 获取分类标签的数量numberOfLabels = len(datingLabels)# 初始化一个空列表,用于存储每个数据点的颜色LabelsColors = []# 遍历分类标签列表for i in datingLabels:if i == 1:# 如果标签为 1,将颜色 'black' 添加到颜色列表中,表示不喜欢的点用黑色表示LabelsColors.append('black')elif i == 2:# 如果标签为 2,将颜色 'orange' 添加到颜色列表中,表示魅力一般的点用橙色表示LabelsColors.append('orange')elif i == 3:# 如果标签为 3,将颜色 'red' 添加到颜色列表中,表示极具魅力的点用红色表示LabelsColors.append('red')# 定义一个内部函数,用于绘制散点图def plot_scatter(ax, x_index, y_index, title, x_label, y_label):# 在指定的子图上绘制散点图,x 轴数据为特征矩阵的第 x_index 列,y 轴数据为特征矩阵的第 y_index 列# 每个点的颜色根据分类标签从 LabelsColors 列表中获取,点的大小为 15,透明度为 0.5# ax 是一个 matplotlib 的 Axes 对象,代表一个子图。通过 ax.scatter 方法,可以在这个特定的子图上进行绘图操作。# x=datingDataMat[:, x_index]# datingDataMat 是一个 NumPy 数组,一般是从文件中读取并处理后得到的特征矩阵,每一行代表一个样本,每一列代表一个特征。# datingDataMat[:, x_index] 运用了 NumPy 的切片操作,选取 datingDataMat 矩阵中所有行的第 x_index 列数据,这些数据将作为散点图中所有散点的横坐标。# y=datingDataMat[:, y_index]# 同理,datingDataMat[:, y_index] 选取 datingDataMat 矩阵中所有行的第 y_index 列数据,这些数据将作为散点图中所有散点的纵坐标。# color=LabelsColors# LabelsColors 是一个包含颜色信息的列表,其长度和 datingDataMat 的行数相同。# 列表中的每个元素对应一个散点的颜色,也就是说,LabelsColors 中的第 i 个元素决定了 datingDataMat 中第 i 行样本所对应的散点的颜色。# s=15# s 参数用于设置散点的大小。这里将散点的大小设置为 15,单位通常是点(points)。# alpha=.5# alpha 参数用于设置散点的透明度。取值范围是 0 到 1,其中 0 表示完全透明,1 表示完全不透明。这里将散点的透明度设置为 0.5,意味着散点具有一定的半透明效果。ax.scatter(x=datingDataMat[:, x_index], y=datingDataMat[:, y_index], color=LabelsColors, s=15, alpha=.5)# 设置子图的标题,使用之前设置的字体属性ax.set_title(title, fontproperties=font)# 设置子图的 x 轴标签,使用之前设置的字体属性ax.set_xlabel(x_label, fontproperties=font)# 设置子图的 y 轴标签,使用之前设置的字体属性ax.set_ylabel(y_label, fontproperties=font)# 设置子图坐标轴刻度的字体大小为 7ax.tick_params(axis='both', labelsize=7)# 返回绘制好的子图return ax# 调用 plot_scatter 函数,绘制第一个子图,x 轴为每年获得的飞行常客里程数,y 轴为玩视频游戏所消耗时间占比axs[0][0] = plot_scatter(axs[0][0], 0, 1, '每年获得的飞行常客里程数与玩视频游戏所消耗时间占比','每年获得的飞行常客里程数', '玩视频游戏所消耗时间占')# 调用 plot_scatter 函数,绘制第二个子图,x 轴为每年获得的飞行常客里程数,y 轴为每周消费的冰激淋公升数axs[0][1] = plot_scatter(axs[0][1], 0, 2, '每年获得的飞行常客里程数与每周消费的冰激淋公升数','每年获得的飞行常客里程数', '每周消费的冰激淋公升数')# 调用 plot_scatter 函数,绘制第三个子图,x 轴为玩视频游戏所消耗时间占比,y 轴为每周消费的冰激淋公升数axs[1][0] = plot_scatter(axs[1][0], 1, 2, '玩视频游戏所消耗时间占比与每周消费的冰激淋公升数','玩视频游戏所消耗时间占比', '每周消费的冰激淋公升数')# 创建一个 Line2D 对象,用于表示不喜欢的点的图例,颜色为黑色,标记为点,标记大小为 6didntLike = mlines.Line2D([], [], color='black', marker='.',markersize=6, label='didntLike')# 创建一个 Line2D 对象,用于表示魅力一般的点的图例,颜色为橙色,标记为点,标记大小为 6smallDoses = mlines.Line2D([], [], color='orange', marker='.',markersize=6, label='smallDoses')# 创建一个 Line2D 对象,用于表示极具魅力的点的图例,颜色为红色,标记为点,标记大小为 6largeDoses = mlines.Line2D([], [], color='red', marker='.',markersize=6, label='largeDoses')# axs 是之前通过 plt.subplots 函数创建的子图数组。这里的 axs 是一个二维数组,因为使用 nrows=2, ncols=2 创建了一个 2x2 的子图布局。
# [axs[0][0], axs[0][1], axs[1][0]] 是一个包含三个子图对象的列表。axs[0][0] 代表第一行第一列的子图,axs[0][1] 代表第一行第二列的子图,
# axs[1][0] 代表第二行第一列的子图。
# for ax in ... 这个循环会依次取出列表中的子图对象,并将其赋值给变量 ax。在每次循环中,ax 都会代表当前正在处理的子图。# 遍历前三个子图for ax in [axs[0][0], axs[0][1], axs[1][0]]:# 在每个子图上添加图例,包含不喜欢、魅力一般和极具魅力三种情况的标记# 2. ax.legend(handles=[didntLike, smallDoses, largeDoses])# ax.legend() 是 matplotlib 中用于在子图上添加图例的方法。# handles 参数接收一个包含 Line2D 对象的列表。didntLike、smallDoses 和 largeDoses 是之前创建的 Line2D 对象,# 分别代表不同类别的数据点(不喜欢、魅力一般、极具魅力)。# 通过传入这个列表,legend 方法会在当前子图上添加一个图例,图例中会显示这三种情况的标记和对应的标签。ax.legend(handles=[didntLike, smallDoses, largeDoses])# 隐藏第四个子图,因为只需要绘制三个子图axs[1][1].axis('off')# 自动调整子图的布局,使它们之间的间距和大小更加合理plt.tight_layout()# 显示绘制好的图形plt.show()if __name__ == '__main__':# 定义要打开的文件名filename = "datingTestSet.txt"# 调用 file2matrix 函数,打开并处理文件,获取特征矩阵和分类标签列表datingDataMat, datingLabels = file2matrix(filename)# 调用 showdatas 函数,将特征矩阵和分类标签列表作为参数传入,进行数据可视化showdatas(datingDataMat, datingLabels)

在这里插入图片描述

代码是通过以下几个步骤来确定每个点的颜色的,下面为你详细解释:

1. 数据分类阶段

file2matrix 函数中,代码会读取文件里的数据,并且按照最后一列的文本描述对数据进行分类,把分类标签存到 classLabelVector 列表中。

def file2matrix(filename):# ... 前面的代码省略 ...for line in arrayOLines:line = line.strip()listFromLine = line.split('\t')returnMat[index, :] = listFromLine[0:3]if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector

这里,'didntLike' 对应标签 1'smallDoses' 对应标签 2'largeDoses' 对应标签 3

2. 颜色映射阶段

showdatas 函数中,代码会依据 datingLabels(也就是 classLabelVector)里的分类标签,为每个数据点分配对应的颜色,把这些颜色存到 LabelsColors 列表中。

def showdatas(datingDataMat, datingLabels):# ... 前面的代码省略 ...LabelsColors = []for i in datingLabels:if i == 1:LabelsColors.append('black')elif i == 2:LabelsColors.append('orange')elif i == 3:LabelsColors.append('red')
  • 要是分类标签是 1,就把颜色 'black' 添加到 LabelsColors 列表里。
  • 要是分类标签是 2,就把颜色 'orange' 添加到 LabelsColors 列表里。
  • 要是分类标签是 3,就把颜色 'red' 添加到 LabelsColors 列表里。

3. 绘制散点图阶段

showdatas 函数里定义的 plot_scatter 函数中,代码会用 LabelsColors 列表为每个数据点设置颜色。

def plot_scatter(ax, x_index, y_index, title, x_label, y_label):ax.scatter(x=datingDataMat[:, x_index], y=datingDataMat[:, y_index], color=LabelsColors, s=15, alpha=.5)# ... 后面的代码省略 ...

ax.scatter 方法的 color 参数接收 LabelsColors 列表,这个列表里的每个元素都和 datingDataMat 中的一行数据对应。也就是说,LabelsColors 列表里的第 i 个元素决定了 datingDataMat 中第 i 行数据对应的点的颜色。

总结

代码先对数据进行分类,为每个数据点赋予一个分类标签,接着依据这些标签把颜色映射到每个数据点上,最后在绘制散点图时,按照映射好的颜色来显示每个点。这样一来,就能确保每个点依据其分类标签显示为对应的颜色(黑色、橙色或者红色)。

import numpy as np"""
Parameters:filename - 文件名
Returns:returnMat - 特征矩阵classLabelVector - 分类Label向量
"""
# 函数说明:打开并解析文件,对数据进行分类:1代表不喜欢,2代表魅力一般,3代表极具魅力
def file2matrix(filename):#打开文件fr = open(filename)#读取文件所有内容arrayOLines = fr.readlines()#得到文件行数numberOfLines = len(arrayOLines)#返回的NumPy矩阵,解析完成的数据:numberOfLines行,3列returnMat = np.zeros((numberOfLines,3))#返回的分类标签向量classLabelVector = []#行的索引值index = 0for line in arrayOLines:#s.strip(rm),当rm空时,默认删除空白符(包括'\n','\r','\t',' ')line = line.strip()#使用s.split(str="",num=string,cout(str))将字符串根据'\t'分隔符进行切片。listFromLine = line.split('\t')#将数据前三列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵returnMat[index,:] = listFromLine[0:3]#根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1return returnMat, classLabelVector"""
Parameters:dataSet - 特征矩阵
Returns:normDataSet - 归一化后的特征矩阵ranges - 数据范围minVals - 数据最小值
"""
# 函数说明:对数据进行归一化
def autoNorm(dataSet):#获得数据的最小值minVals = dataSet.min(0)maxVals = dataSet.max(0)#最大值和最小值的范围ranges = maxVals - minVals#shape(dataSet)返回dataSet的矩阵行列数normDataSet = np.zeros(np.shape(dataSet))#返回dataSet的行数m = dataSet.shape[0]#原始值减去最小值normDataSet = dataSet - np.tile(minVals, (m, 1))#除以最大和最小值的差,得到归一化数据normDataSet = normDataSet / np.tile(ranges, (m, 1))#返回归一化数据结果,数据范围,最小值return normDataSet, ranges, minValsif __name__ == '__main__':#打开的文件名filename = "datingTestSet.txt"#打开并处理数据datingDataMat, datingLabels = file2matrix(filename)normDataSet, ranges, minVals = autoNorm(datingDataMat)print(normDataSet)print(ranges)print(minVals)
[[0.44832535 0.39805139 0.56233353][0.15873259 0.34195467 0.98724416][0.28542943 0.06892523 0.47449629]...[0.29115949 0.50910294 0.51079493][0.52711097 0.43665451 0.4290048 ][0.47940793 0.3768091  0.78571804]]
[9.1273000e+04 2.0919349e+01 1.6943610e+00]
[0.       0.       0.001156]

233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]

[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
[9.1273000e+04 2.0919349e+01 1.6943610e+00]
[0. 0. 0.001156]



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

相关文章

【赵渝强老师】达梦数据库的物理存储结构

达梦数据库由硬盘上的文件组成,而要读写数据需要通过达梦实例来完成。那么,达梦数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是达梦数据库的存储结构。达梦数据库的存储结构是由逻辑存储结构和物理存储结构组成。一…

【AcWing】算法基础课-数学知识

目录 1、质数 1.1 试除法判定质数 暴力解法 优化解法 1.2 分解质因数(试除法) 暴力解法 优化解法 1.3 筛质数 朴素筛法(nlogn) 埃氏筛法(nloglogn) 线性筛法(n) 2、约数 2.1 试除法求约数 2.2 约数个数 2.3 约数之和 2.4 最大公约数 实现方法一 实现方法二 …

【测试篇】关于allpairs实现正交测试用例保姆级讲解,以及常见的错误问题

前言 🌟🌟本期讲解关于测试工具相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不多说…

【C语言】内存函数详解

个人主页 文章目录 🏠一、memcpy函数1.函数形式以及功能介绍2.函数的使用3.模拟实现 🚀二、memmove函数1.函数形式以及功能介绍2.函数的使用3.模拟实现 🎡三、memset函数1.函数形式以及功能介绍2.函数的使用 🎉四、memcmp1.函数形…

高速开源镜像站网址列表2503

高速开源镜像站网址列表 以下是国内常用的高速开源镜像站网址列表,涵盖企业和教育机构的主要站点,适用于快速下载开源软件和系统镜像: 一、企业镜像站 阿里云镜像站 地址:https://mirrors.aliyun.com/ 特点:覆盖广泛…

安科瑞新能源防逆流解决方案:守护电网安全,赋能绿色能源利用

随着光伏、储能等新能源在用户侧的快速普及,如何避免电力逆流对电网造成冲击,成为行业关注的焦点。安科瑞凭借技术实力与丰富的产品矩阵,推出多场景新能源防逆流解决方案,以智能化手段助力用户实现安全、经济的能源管理&#xff0…

如何重装windows系统

制作U盘启动媒介 找一个大于8g的U盘,取windows的官网上下载启动器 不要下载第一个,会出现一些未知的问题,这是一个更新助手 不要下载第三个,这是一个iso镜像 高手用于刻录光盘或者u盘虚拟机装载 下载第二个 很快就会下载完毕&…

SmolVLM2: 让视频理解能力触手可及

一句话总结: SmolVLM 现已具备更强的视觉理解能力📺 SmolVLM2 标志着视频理解技术的根本性转变——从依赖海量计算资源的巨型模型,转向可在任何设备运行的轻量级模型。我们的目标很简单: 让视频理解技术从手机到服务器都能轻松部署。 我们同步发布三种规…