【Python机器学习】k-近邻算法简单实践——改进约会网站的配对效果

需求背景:

XX一直使用约会网站寻找适合自己的约会对象,ta会把人分为3种类型:

不喜欢、魅力一般、非常有魅力

对人分类轴,发现了对象样本的以下3种特征:

1、每年获得的飞行里程数

2、玩视频游戏所耗时间百分比

3、每周消费的冰淇淋数量

数据初始化:

将上述特征输入到分类器之前,必须将待处理数据的格式处理成分类器可以接受的格式。因为源数据存在txt文件中,所以要创建一个函数处理数据:

def file2matrix(filename):fr=open(filename)arrayOlines=fr.readlines()numberOfLines=len(arrayOlines)returnMat=zeros((numberOfLines,3))classLabelVector=[]index=0for line in arrayOlines:line=line.strip()listFromLine=line.split('\t')returnMat[index,:]=listFromLine[0:3]classLabelVector.append(int(listFromLine[-1]))index += 1return returnMat,classLabelVector

从上面的代码可以看到,Python处理文本文件非常容易。

处理顺序:

1、获得文件的行数

2、创建以0填充的矩阵NumPy

3、循环处理文件中的每行数据,使用函数line.strip()截取掉所有的回车字符

分析数据:

使用Matplotlib制作原始数据的散点图:

datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()

可以看到,由于没有使用样本分类的特征值,很难从图中看出任何有用的数据模式信息,所以调试代码,利用scatter函数进行个性化标记散点图上的点:

ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))

现在就可以看出每种分类人群的特征

准备数据:归一化数值

从数据上可以看出,每年飞行里程数对于计算结果的影响远远大于另外两个特征的影响。而产生这种线性的原因,仅仅是因为飞行里程数远大于其他特征,但因为用户认为这三种特征是同等重要的,所以作为特征之一,里程数不应该如此严重的影响到计算结果。

处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,比如将取值范围处理为0到1或者-1到1之间。下面的公式可以将任意取值范围转化为0到1区间内的值:

newValue=(oldValue-min)/(max-min)

其中min和max分别是数据集中的最小特征值和最大特征值。

归一化函数:

def autoNorm(dataSet):minVals=dataSet.min(0)maxVals=dataSet.max(0)ranges=maxVals-minValsnormDataSet=zeros(shape(dataSet))m=dataSet.shape[0]normDataSet=dataSet-tile(minVals,(m,1))normDataSet=normDataSet/tile(ranges,(m,1))return normDataSet,ranges,minVals

在这个函数中,我们将每列的最小值放在变量minVals中,将最大值放在变量maxVals中,其中dataSet.min(0)中的参数0使得函数可以从列中选取最小值,而不是选取当前行的最小值。然后,函数计算可能的取值范围,并创建新的返回矩阵。为了归一化特征值,我们必须使用当前值减去最小值,然后除以取值范围。需要注意的是,特征矩阵由1000*3个值,而minVals和range的值都是1*3.为了解决这个问题,使用NumPy库中的tile()函数将变量内容复制乘输入矩阵同样大小的矩阵。这是具体特征值相处。

测试算法:作为完整程序验证分类器

机器学习算法一个很重要的工作就是评估算法的正确率,通常我们只提供90%的数据作为训练样本,而使用剩余的10%作为测试数据。其中10%的测试数据应该是随机选择的。

完美分类器的错误量为0,而错误率为1.0的分类器不会给出任何正确的分类

为了测试分类器效果,我们创建以下函数:

def datingClassTest():hoRatio=0.10datingDataMat=datingLabels=file2matrix('datingTestSet2.txt')normMat,ranges,minVals=autoNorm(datingDataMat)m=normMat.shape[0]errorCount=0.0numTestVecs=int(m*hoRatio)for i in range(numTestVecs):classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,],datingLabels[numTestVecs:m],3)print(classifierResult,datingLabels[i])if (classifierResult!=datingLabels[i]):errorCount+=1.0print(errorCount/float(numTestVecs))

函数datingClassTest首先使用了file2matrix和autoNorm函数从文件中读取数据并将其转化为归一化特征值。接着计算测试向量的数量,这一步决定了normMat向量中哪些数据用于测试,那些数据用于训练;然后将这两部分数据输入到原始kNN分类器函数classify0.最后,函数计算错误率并输出结果。

需要注意,此处我们使用原始分类器。

分类器处理数据集的错误率为5%,这是一个还不错的结果。我们可以改变函数中hoRatio和变量k的值,检测错误率是否会随着变量值的变换而增加,

使用算法:构建完整可用系统

上面已经在数据上对分类器进行了测试,现在可以用这个分类器对人员进行分类:

def classifyPerson():resultList=['完全不喜欢','一般魅力','很有魅力']percentTats=float(input('每年玩视频游戏的时间比例?'))ffMiles=float(input('每年的飞行里程数?'))iceCream=float(input('每年吃冰激凌的数量?'))datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')normMat,ranges,minVals=autoNorm(datingDataMat)inArr=array([ffMiles,percentTats,iceCream])classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)print('你对于这个人的感受:',resultList[classifierResult-1])

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

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

相关文章

linux操作系统之线程

1.线程概念 线程是一个轻量级进程,每一个线程都属于一个进程 进程是操作系统资源分配的最小单位,而线程是CPU任务调度的最小单位 线程是一个任务执行的过程,包括创建,调度,消亡 创建:线程空间位于进程空间,进程中的线程,栈区独立,并共享进程中的数据区,文本区,堆区 调度:宏观…

常见的JS混淆及处理办法

1,变量名混淆 文本增添属性的过程中有很多操作空间 原始代码: s[age,job] function xx(){};xx.prototype[s[0]]15 xx.prototype[s[1]]teacheranew xx() 将属性名经过base64加密,并对函数名xx,,数组名s,经过混淆处理…

【C++】C++如何使用结构体中的枚举类型

目录 示例1:在结构体中定义枚举 示例2:使用枚举作为结构体成员的类型 示例3:在结构体方法中使用枚举 注意事项 在C中,可以在结构体( struct )中定义枚举类型,并使用这些枚举值作为结构体成员…

【网络安全的神秘世界】 文件上传及验证绕过

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 这个漏洞对于初学者好挖,先找到文件上传的位置 文件上传是web网页中常见的功能之一,通常情况下恶意文…

C# 进制之间的转换(二进制,八进制,十进制,十六进制)

常用的方法是:Convert.ToString(byte value, int toBase), 并且有多个重载方法, value的类型可以为short,int 等,但必须是整数且不能为负数, 一般默认为十进制 toBase: 返回值的基数,必须是 2、…

以太坊的可扩展性危机:探索执行层的瓶颈

导读:以太坊执行层承担着交易处理、智能合约执行以及保持一致和安全状态的维护等工作。Fuel Labs 撰文解析了以太坊执行层的工作原理,及其在可扩展性方面的发展瓶颈和影响。 Fuel Labs: 执行是指在区块链上执行交易和执行状态更改所需的计算。此计算通常…

【数据结构初阶】一篇文章带你超深度理解【单链表】

hi ! 目录 前言: 1、链表的概念和结构 2、单链表(Single List,简写SList)的实现 2.1 定义链表(结点)的结构 2.2 创建一个链表 2.3 打印链表 2.4 尾插 2.5 头插 2.6 尾删 2.7 头…

python中argparse模块及action=‘store_true‘详解

1. 指定action时 通俗讲,action的作用就是在命令行中指定参数名称时,参数的取值。 如: parser.add_argument(--save-file, actionstore_true, defaultFalse, help是否保存文件) 给参数设置action之后,命令执行时,…

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

C基础(学习)2024.7.24

Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC 数值表示,词法符号,变量,常量相关知识可以查看…

数据结构初阶(C语言)-二叉树

一,树的概念与结构 树是⼀种非线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有⼀个特殊的结点&a…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好,办公人…

昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐

文章目录 昇思MindSpore应用实践1、MusicGen模型简介残差矢量量化(RVQ)SoundStreamEncodec 2、生成音乐无提示生成文本提示生成音频提示生成 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、MusicGen模型简…

python使用 tkinter 生成随机颜色

先看效果: 只要不停点击底部的按钮,每次都会生成新的颜色。炫酷啊。 import random import tkinter import tkinter.messagebox from tkinter import Button# todo """ 1. 设置一个按钮,来让用户选择是否显示颜色值 2. 把按钮换成 Label…

谷粒商城实战笔记-错误记录-启动失败

文章目录 一,lombok报错二,Output directory is not specified 一,lombok报错 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok …

MATLAB的基础知识

matlab的基本小常识 1. 在每行语句后面加上英文分号表示不在命令行窗口显示运行结果。 a 3; a 5 2. 多行注释快捷键,CTRLR。 3. 取消多行注释,CTRLT。 4. 清空工作区的所有变量使用clear。 5. 清空命令行窗口的所有变量使用clc。 6. clc和clear一起使…

初试Ollama本地大模型

准备工作 机器配置: CPUi5-10400内存16GB硬盘SSD 480GB显卡GTX 1660 系统:Ubuntu 18.04 Server NVIDIA驱动安装 - 下载 驱动下载地址:https://www.nvidia.cn/geforce/drivers/ - 获取下载链接 GTX 1660驱动下载链接:https://…

怎么理解FPGA的查找表与CPLD的乘积项

怎么理解 fpga的查找表 与cpld的乘积项 FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)是两种常见的数字逻辑器件,它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表(LUT,L…

Git如何将一个分支上的修改转移到另一个分支

在我们使用git进行版本控制时,当代码写错分支,怎么将这些修改转移到正确的分支上去呢?这时,我们可以使用git stath命令来暂存我们的修改,然后再切换到其他分支 未commit(提交)操作时 1. 先将修…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…