机器学习实战1-kNN最近邻算法

news2024/12/23 9:57:41

文章目录

  • 机器学习基础
    • 机器学习的关键术语
  • k-近邻算法(KNN)
    • 准备:使用python导入数据
    • 实施kNN分类算法
    • 示例:使用kNN改进约会网站的配对效果
      • 准备数据:从文本文件中解析数据
      • 分析数据
      • 准备数据:归一化数值
      • 测试算法:作为完整程序验证分类器
    • 手写识别系统

机器学习基础

机器学习的关键术语

1、属性:将一种事务分类的特征值称为属性,例如我们在做鸟类分类时,我们可以将体重、翼展、脚蹼、后背颜色作为特征,特征通常时训练样本的列,它们是独立测量得到的结果,多个特征联系在一起共同组成一个训练样本
2、目标变量:就是我们要分类的那个结果
3、训练集和测试集:训练集作为算法的输入,用于训练模型,测试集用于检验训练的效果

k-近邻算法(KNN)

主要思想:我们先将已知标签的数据以及对应的标签输入,当输入未知标签的数据时,我们希望根据输入的特征值来判断该数据的特征值,我们先计算该数据与我们已知标签的数据的距离,并将距离排序,取前k个数据,根据前k个数据中出现次数最多的数据的标签作为新数据标签的分类

kNN算法主要是用于分类的一种算法

屏幕截图 2023-08-04 174500.png

准备:使用python导入数据

from numpy import *
# kNN排序时将使用这个模块提供好的函数
import operator

def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

实施kNN分类算法

1.png

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1) - dataSet)
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis = 1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

   sortedClassCount = sorted(classCount.items(),
                              key = operator.itemgetter(1), reverse= True)
	return sortedClassCount[0][0]

这里先说一下shape函数,只做简单说明,shape函数用于确定array的维度比如

group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
print(group.shape)

这里输出的结果是(4,2)

也就是说返回的是矩阵或者数组每一维的长度,返回的结果是一个元组(tuple),元组和例表的区别不能忘记,元组不可修改,列表可以修改

tile()函数,tile是numpy模块中的一个函数,用于矩阵的复制,tile(A, reps), A表示我们要操作的矩阵,reps是我们复制的参数,可以是一个数也可以是一个矩阵(4, 2),tile(A, (4, 2))表示将A矩阵的列复制4次,行复制两次

argsort()方法,对数组进行排序,这里返回的是排序后的下标这和C++中的sort()方法不同

argsort()实现倒序排序

group = array([2, 3, 5, 4])
x = argsort(-group)
print(x)

字典中的get()方法

python中对于非数值型数据进行排序,例如字典

sorted(iterable, cmp=None, key=None, reverse=False)

iterable是一个迭代器,
cmp是比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

 sortedClassCount = sorted(classCount.iteritems(),
                              key = operator.itemgetter(1), reverse= True)

python中的items()返回的是一个列表,iteritems()返回一个迭代器, itemgetter()方法可用于指定关键字排序,operator.itemgetter(1)是按字典中的值进行排序,reverse= True按降序排序,python3已经不支持iteritems(),这里用items()即可。

字典中的get()方法

dict_name.get(key, default = None)

key是我们要查找字典中的key,如果存在则返回对应的值,如果不存在就返回第二个我们设置的参数,当我们没设置时,默认返回None

示例:使用kNN改进约会网站的配对效果

2.png

准备数据:从文本文件中解析数据

from numpy import *

def file2matrix(filename):
    fr = open(filename)
    arrarOLines = fr.readlines()
    numberOfLines = len(arrarOLines)
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index = 0
    for line in arrarOLines:
        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 += 1
    return returnMat, classLabelVector

分析数据

from numpy import *
# kNN排序时将使用这个模块提供好的函数
import operator
import matplotlib
import matplotlib.pyplot as plt

def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis = 1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    sortedClassCount = sorted(classCount.items(),
                              key = operator.itemgetter(1), reverse= True)
    return sortedClassCount[0][0]

# [group, labels] = createDataSet()
# m = classify0([0, 0], group, labels, 2)
# print(m)


def file2matrix(filename):
    fr = open(filename)
    arrarOLines = fr.readlines()
    numberOfLines = len(arrarOLines)
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index = 0
    for line in arrarOLines:
        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 += 1
    return returnMat, classLabelVector


datingDataMat, datingLabels = file2matrix('C:/Users/cxy/OneDrive/桌面/datingTestSet.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()

结果截图:
3.png

add_subplot(x)中参数的含义:
这里前两个表示几*几的网格,最后一个表示第几子图
可能说的有点绕口,下面上程序作图一看说明就明白

import matplotlib.pyplot as plt
fig = plt.figure(figsize = (5,5)) 
ax = fig.add_subplot(221)
ax = fig.add_subplot(222)
ax = fig.add_subplot(223)
ax = fig.add_subplot(224)

4.png

scatter()方法
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
marker:点的样式,默认小圆圈 ‘o’。
cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
alpha::透明度设置,0-1 之间,默认 None,即不透明。
linewidths::标记点的长度。
edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。
plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
**kwargs::其他参数。
我们主要用到的是前四个参数,第一个参数是我们要画散点图的横坐标,第二个是纵坐标,第三个散点图中点的颜色,第四个散点图中点的大小

准备数据:归一化数值

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

normMat, ranges, minVals = autoNorm(datingDataMat)
print(normMat)

min()、max()方法
minVals = dataSet.min(0) 返回dataSet中每一列中的最小值数组
minVals = dataSet.min(1) 返回dataSet中每一行中的最小值数组

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

def datingClassTest():
    hoRatio = 0.10
    datingDataMat, datingLabels = file2matrix('C:/Users/cxy/OneDrive/桌面/datingTestSet.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
        print(f"the classifier came back with: {classifierResult}, the real answer is : {datingLabels[i]}")
        if classifierResult != datingLabels[i]:
            errorCount += 1.0
    print(f"the total error rate is : {errorCount / float(numTestVecs)}")

datingClassTest();

手写识别系统

from numpy import *
# kNN排序时将使用这个模块提供好的函数
import operator
import matplotlib
import matplotlib.pyplot as plt

def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis = 1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    sortedClassCount = sorted(classCount.items(),
                              key = operator.itemgetter(1), reverse= True)
    return sortedClassCount[0][0]

# [group, labels] = createDataSet()
# m = classify0([0, 0], group, labels, 2)
# print(m)


def file2matrix(filename):
    fr = open(filename)
    arrarOLines = fr.readlines()
    numberOfLines = len(arrarOLines)
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index = 0
    for line in arrarOLines:
        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 += 1
    return returnMat, classLabelVector


# datingDataMat, datingLabels = file2matrix('C:/Users/cxy/OneDrive/桌面/datingTestSet.txt')
# print(datingDataMat)
# fig = plt.figure()
# ax = fig.add_subplot(111)
# ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2], 15.0*array(datingLabels), 15.0*array(datingLabels))
# plt.show()

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

# normMat, ranges, minVals = autoNorm(datingDataMat)
# print(normMat)

# def datingClassTest():
#     hoRatio = 0.10
#     datingDataMat, datingLabels = file2matrix('C:/Users/cxy/OneDrive/桌面/datingTestSet.txt')
#     normMat, ranges, minVals = autoNorm(datingDataMat)
#     m = normMat.shape[0]
#     numTestVecs = int(m*hoRatio)
#     errorCount = 0.0
#     for i in range(numTestVecs):
#         classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
#         print(f"the classifier came back with: {classifierResult}, the real answer is : {datingLabels[i]}")
#         if classifierResult != datingLabels[i]:
#             errorCount += 1.0
#     print(f"the total error rate is : {errorCount / float(numTestVecs)}")
#
# datingClassTest();

def classifyPerson():
    resultList = ['not at all', 'in small doses', 'in large doses']
    percentTats = float(input("percentage of time spent playing video games?"))
    ffMiles = float(input("frequent flier miles earned per year?"))
    iceCream = float(input("liters of ice cream consumed per year?"))
    datingDataMat, datingLabels = file2matrix('C:/Users/cxy/OneDrive/桌面/datingTestSet.txt')
    normMat, ranges, minVals = autoNorm(datingDataMat)
    inArr = array([ffMiles, percentTats, iceCream])
    classifierResult = classify0((inArr - minVals) / ranges, normMat, datingLabels, 3)
    print(f"You will probably like this person: {resultList[classifierResult - 1]}")

classifyPerson()

5.png

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

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

相关文章

淘宝API接口为开发者提供了与淘宝平台进行数据交互和操作的便捷途径

淘宝API接口是指淘宝开放平台提供的一套接口,用于与淘宝网进行数据交互和操作。通过使用淘宝API接口,第三方开发者可以实现商品搜索、店铺信息获取、订单管理、商家服务等功能,从而实现与淘宝平台的对接和数据共享。 淘宝API接口的使用可以帮…

C语言赋值号的运算顺序

从右到左。 int & f(int & a) { printf("参数 %d\n", a); return a; } int main(void) {int a 9;int b 3;f(a) f(b);// 运行到此处,a 3,b 3return 0; } 输出

卡尔曼滤波算法demo

代码 learn_kalman.py #codingutf-8 import numpy as np import time from kinematic_model import freedrop from controller import kalman_filterimport matplotlib.pyplot as plt # 支持中文 import matplotlib as mpl mpl.rcParams[font.family]SimHei plt.rcParams[a…

每天一道leetcode:剑指Offer 25.合并两个链表

今日份题目&#xff1a; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 提示 0 < 链表长度 < 1000 题目思路 递归…

BL302嵌入式ARM控制器:高性能处理器驱动的储能优化利器

嵌入式ARM控制器钡铼技术BL302系列是工业级坚固型工业控制器&#xff0c;采用NXP的高性能处理器I.MX6ULL&#xff0c;搭配先进的ARM Cortex-A7构架&#xff0c;运行速度高达800MHz&#xff0c;具有高度的稳定性。本产品最高可提供4路RS485/RS232&#xff0c;1路CAN口&#xff0…

嵌入式开发学习(STC51-13-温度传感器)

内容 通过DS18B20温度传感器&#xff0c;在数码管显示检测到的温度值&#xff1b; DS18B20介绍 简介 DS18B20是由DALLAS半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器&#xff1b; 与传统的热敏电阻等测温元件相比&#xff0c;它是一…

SpringBoot整合达梦数据库

近期接到了一个需要国产化的项目&#xff0c;用到了达梦数据库&#xff0c;没想到一开始配置就出现了问题&#xff0c;下面把配置给大家粘贴出来&#xff0c;大家少踩点坑。 一、先下载达梦数据库 这是达梦数据库下载链接&#xff0c;达梦数据库没有免费的&#xff0c;个人好…

Chapter 12: Regular expressions | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Regular ExpressionsRegular ExpressionsCharacter matching in regular expressionsExtracting data using regular expressionsCombining searching and extractingEscape characterSummaryBonus section for Unix / Linux usersDebugg…

[保研/考研机试] 约瑟夫问题No.2 C++实现

题目要求&#xff1a; 输入、输出样例&#xff1a; 源代码&#xff1a; #include<iostream> #include<queue> #include<vector> using namespace std;//例题5.2 约瑟夫问题No.2 int main() {int n, p, m;while (cin >> n >> p >> m) {//如…

【LeetCode】字符串与栈的练习

字符串相乘 class Solution { public:/** 将两个字符串相乘拆分成两步&#xff1a;* 先将一个字符串的每个字符与另一个字符串相乘得到一个计算结果* 再将所有计算结果的字符串进行相加*/string multiply(string num1, string num2) {string result "0";// 一个字…

微服务——es数据聚合+RestClient实现聚合

数据聚合 聚合的种类 DSL实现Bucket聚合 如图所示&#xff0c;设置了10个桶&#xff0c;那么就显示了数量最多的前10个桶&#xff0c;品牌含有7天酒店的有30家&#xff0c; 品牌含有如家的也有30家。 修改排序规则 限定聚合范围 DSL实现Metrics聚合 如下案例要求对不同的品…

录像模糊变高清:提高录制视频清晰度的方法

录像是记录生活点滴的重要方式之一&#xff0c;然而&#xff0c;由于种种原因&#xff0c;我们可能会遇到一些模糊、不清晰的视频。为了解决这一问题&#xff0c;今天来给大家分享一下如何利用牛学长视频修复工具修复录像视频清晰度的方法&#xff0c;方便快捷&#xff0c;无需…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

批量查询快递信息的最佳解决方案

快递查询是我们日常生活中经常需要进行的操作&#xff0c;然而&#xff0c;当我们有多个快递单号需要查询时&#xff0c;逐个查询就显得非常繁琐和耗时。为了解决这个问题&#xff0c;今天给大家推荐一款实用的软件——【固乔快递查询助手】。 首先&#xff0c;在浏览器中搜索并…

Activity启动过程详解(Android 12源码分析)

Activity的启动方式 启动一个Activity&#xff0c;通常有两种情况&#xff0c;一种是在应用内部启动Activity&#xff0c;另一种是Launcher启动 1、应用内启动 通过startActivity来启动Activity 启动流程&#xff1a; 一、Activity启动的发起 二、Activity的管理——ATMS 三、…

Mysql根据创建时间表分区实践

背景 最近订单表遇到大数据量的问题&#xff0c;并且表中随着时间的积累会变得更大&#xff0c;当数据量较大时&#xff0c;存储的物理文件会变得非常大、使用性能很差。 我们用的是GaussDB。为了提高查询效率&#xff0c;建议表大于500w进行分区&#xff0c;所以在规划阶段我…

opencv基础47 查找图像轮廓cv2.findContours()详解

什么是图像轮廓&#xff1f; 图像轮廓是指图像中物体边缘的连续性曲线。在计算机视觉和图像处理中&#xff0c;轮廓通常被用于检测物体、分割图像以及提取物体特征。 图像轮廓是由一系列连续的像素点组成&#xff0c;这些像素点位于物体边界上。轮廓的特点是在物体和背景之间的…

springboot生成表结构和表数据sql

需求 业务背景是需要某单机程序需要把正在进行的任务导出&#xff0c;然后另一台电脑上单机继续运行&#xff0c;我这里选择的方案是同步SQL形式&#xff0c;并保证ID随机&#xff0c;多个数据库不会重复。 实现 package com.nari.web.controller.demo.controller;import cn…

Android 11 获取启动其他应用

Android 11 获取启动其他应用 本文代码地址 https://gitee.com/chenjim/QueryAppInfo 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 如果应用以 Android 11&#xff08;API 级别 30&#xff09;或更高版本为目标平台&#xff0c;并查询与设备上已安装的其他应用相…

Python 面试必知必会(一):数据结构

《Python Cookbook》的作者David Beazley的课程PPT开源了&#xff0c;目标用户是希望从编写基础脚本过渡到编写更复杂程序的高级 Python 程序员&#xff0c;课程主题侧重于流行库和框架中使用的编程技术&#xff0c;主要目的是更好地理解 Python 语言本身&#xff0c;以便阅读他…