iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python机器学习之KNN近邻算法
  • 889
分享到

Python机器学习之KNN近邻算法

2024-04-02 19:04:59 889人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、KNN概述二、使用python导入数据三、numpy.array()四、实施KNN分类算法五、计算已知类别数据集中的点与当前点之间的距离六、完整代码七、数据处理、分析、测试八

一、KNN概述

简单来说,K-近邻算法采用测量不同特征值之间的距离方法进行分类

优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称2型

工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系(训练集)。输入没有标签的新数据之后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签(测试集)。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处。(通常k不大于20)

二、使用Python导入数据

我们先写入一段代码


from numpy import *		# 导入numpy模块
import operator		# 导入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

此处稍微介绍一下numpy这个包吧

三、numpy.array()

NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。
在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank,但是和线性代数中的秩不是一样的,在用python求线代中的秩中,我们用numpy包中的linalg.matrix_rank方法计算矩阵的秩
线性代数中秩的定义:设在矩阵A中有一个不等于0的r阶子式D,且所有r+1阶子式(如果存在的话)全等于0,那末D称为矩阵A的最高阶非零子式,数r称为矩阵A的秩,记作R(A)。

四、实施KNN分类算法

依照KNN算法,我们依次来

先准备好四个需要的数据

  • inX:用于分类的输入向量inX
  • dataSet:输入的训练样本集dataSet
  • labels:标签向量labels(元素数目和矩阵dataSet的行数相同)
  • k:选择最近邻居的数目

五、计算已知类别数据集中的点与当前点之间的距离

使用欧式距离:

在这里插入图片描述

六、完整代码


# 返回矩阵的行数
dataSetSize = dataSet.shape[0]	
# 列数不变,行数变成dataSetSize列
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5

第一行


# 返回矩阵的行数
dataSetSize = dataSet.shape[0]	
# 以第一步的数据为例
answer:4		# 4行

第二行


inX = [1. , 0.]
# 列数不变,行数变成dataSetSize列
diffMat = tile(inX, (dataSetSize, 1)) - dataSet

# tile(inX, (dataSetSize, 1))
inX = [
	[1. , 0.],
	[1. , 0.],
	[1. , 0.],
	[1. , 0.]
]
# inX - dataSet两个矩阵相减(行列相等相加相减才有意义)
dataSet = [
		[1. , 1.1],
        [1. , 1. ],
        [0. , 0. ],
        [0. , 0.1]
]
diffMat = [
	[0. , -1.1],
	[0. , -1.],
	[1. , 0.],
	[1. , -0.1]
]

第三行


# 求平方差
sqDiffMat = diffMat * 2

第四行


# 计算矩阵中每一行元素之和
# 此时会形成一个多行1列的矩阵
sqDistances = sqDiffMat.sum(axis=1)

第五行


# 开根号
distances = sqDistances**0.5

按照距离递增次序排序


# 对数组进行排序
sortedDistIndicies = distances.argsort()

选择与当前点距离最小的k个点


classCount = {}		# 新建一个字典
# 确定前k个距离最小元素所在的主要分类
for i in range(k):
	# voteIlabel的取值是labels中sortedDistIndicies[i]的位置
	voteIlabel = labels[sortedDistIndicies[i]]
	classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

确定前k个点所在类别的出现概率


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

###11# 返回前k个点出现频率最高的类别作为当前点的预测分类


return sortedClassCount[0][0]

刚刚试一试c++的版本…小心,救命


#include <iOStream>
#include <vector>
#include <alGorithm>
#include <cmath>
#include <map>
int sum_vector(std::vector<int>& v) {
	int sum = 0;
	for (int i = 0; i < v.size(); ++i) {
		sum = v[i] + sum;
	}
	return sum;
}
int knn(int k) {
	using std::cout;
	using std::endl;
	using std::vector;
	vector<vector<int>> x;	
	vector<int> x_sample = {2, 3, 4};	
	for (int i = 0; i < 4; ++i) {
		x.push_back(x_sample);
	}
	vector<int> y = {1, 1, 1, 1};
	int dataSetSize = x.size();		

	vector<int> x_test = {4, 3, 4};
	vector<vector<int>> x_test_matrix;
	for (int i = 0; i < dataSetSize; ++i) {
		x_test_matrix.push_back(x_test);
	}
	vector<int> v_total;
	for (int i = 0; i < dataSetSize; ++i) {
		for (int j = 0; j < x_test_matrix[i].size(); ++j) {
			x_test_matrix[i][j] = x_test_matrix[i][j] - x[i][j];
			x_test_matrix[i][j] = x_test_matrix[i][j] * 2;
		}
		int sum_vec = sum_vector(x_test_matrix[i]);
		v_total.push_back(sqrt(sum_vec));
	}
	sort(v_total.begin(), v_total.end());
	std::map<int, int> mp;
	for (int i = 0; i < k; ++i) {
		int label = y[v_total[i]];
		mp[label] += 1;
	}
	int max_end_result = 0;
	for (std::map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
		if (it->first > max_end_result) {
			max_end_result = it->first;
		}
	}
	return max_end_result;
}
int main() {
	int k = 12;
	int value = knn(k);
	std::cout << "result:\n" << std::endl;
	return 0;
}

七、数据处理、分析、测试

处理excel和txt数据

excel数据是矩阵数据,可直接使用,在此不做处理。

文本txt数据需要一些数据处理


def file2matrix(filename):
	fr = open(filename)
	# 读取行数据直到尾部
	arrayOLines = fr.readlines()
	# 获取行数
	numberOfLines = len(arrayOLines)
	# 创建返回shape为(numberOfLines, 3)numpy矩阵
	returnMat = zeros((numberOfLines, 3))
	classLabelVector = []
	index = 0
	for line in arrayOLines:
		# 去除首尾的回车符
		line = line.strip()
		# 以tab字符'\t'为符号进行分割字符串
		listFromLine = line.split('\t')
		# 选取前3个元素,把他们存储到特征矩阵中
		returnMat[index, :] = listFromLine[0: 3]
		# 把目标变量放到目标数组中
		classLabelVector.append(int(listFromLine[-1]))
		index += 1
	return returnMat, classLabelVector

数据归一化和标准化

在数值当中,会有一些数据大小参差不齐,严重影响数据的真实性,因此,对数据进行归一化和标准化是使得数据取值在一定的区间,具有更好的拟合度。

例如归一化就是将数据取值范围处理为0到1或者-1到1之间


# max:最大特征值
# min:最小特征值
newValue = (oldValue - min)/(max-min)

写个函数


def autoNORM(dataSet):
	# min(0)返回该矩阵中每一列的最小值
	minVals = dataSet.min(0)
	# max(0)返回该矩阵中每一列的最大值
	maxVals = dataSet.max(0)
	# 求出极值
	ranges = maxVals - minVals
	# 创建一个相同行列的0矩阵
	normDataSet = zeros(shape(dataSet))
	# 得到行数
	m = dataSet.shape[0]
	# 得到一个原矩阵减去m倍行1倍列的minVals
	normDataSet = dataSet - tile(minVlas, (m,1))
	# 特征值相除
	normDataSet = normDataSet/tile(ranges, (m, 1))
	return normDataSet, ranges, minVals

归一化的缺点:如果异常值就是最大值或者最小值,那么归一化也就没有了保证(稳定性较差,只适合传统精确小数据场景)

标准化可查

八、鸢尾花数据测试

既然已经了解其内置的算法了,那么便调库来写一个吧


from sklearn.datasets import load_iris      # 导入内置数据集
from sklearn.model_selection import train_test_split        # 提供数据集分类方法
from sklearn.preprocessing import StandardScaler        # 标准化
from sklearn.neighbors import KNeighborsClassifier      # KNN


def knn_iris():
    # 获得鸢尾花数据集
    iris = load_iris()
    # 获取数据集
    # random_state为随机数种子,一个数据集中相等的行不能大于6
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 特征工程:标准化
    transfer = StandardScaler()
    # 训练集标准化
    x_train = transfer.fit_transform(x_train)
    # 测试集标准化
    x_test = transfer.transform(x_test)
    # 设置近邻个数
    estimator = KNeighborsClassifier(n_neighbors=3)
    # 训练集测试形成模型
    estimator.fit(x_train, y_train)

    # 模型预估
    # 根据预测特征值得出预测目标值
    y_predict = estimator.predict(x_test)
    print("y_predict: \n", y_predict)
    # 得出预测目标值和真实目标值之间是否相等
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)


def main():
    knn_iris()


if __name__ == '__main__':
    main()

九、RESULT

在这里插入图片描述

到此这篇关于Python机器学习之KNN近邻算法的文章就介绍到这了,更多相关Python近邻算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python机器学习之KNN近邻算法

本文链接: https://www.lsjlt.com/news/125896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python机器学习之KNN近邻算法
    目录一、KNN概述二、使用Python导入数据三、numpy.array()四、实施KNN分类算法五、计算已知类别数据集中的点与当前点之间的距离六、完整代码七、数据处理、分析、测试八...
    99+
    2024-04-02
  • 【python】机器学习-K-近邻(KNN)算法
             目录 一 . K-近邻算法(KNN)概述  二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法(KNN)概述          K-近邻算法(KNN)是一种基本的分类算法,它通过计算数据点之...
    99+
    2023-10-22
    python matlab 机器学习 算法
  • python机器学习基础K近邻算法详解KNN
    目录一、k-近邻算法原理及API1.k-近邻算法原理2.k-近邻算法API3.k-近邻算法特点二、k-近邻算法案例分析案例信息概述第一部分:处理数据1.数据量缩小2.处理时间3.进一...
    99+
    2024-04-02
  • Python机器学习实战之k-近邻算法的实现
    目录K-近邻算法概述工作原理实施KNN算法示例:手写识别系统K-近邻算法概述 简单地说, k-近邻算法采用测量不同特征值之间的距离方法进行分类。 k-近邻算法 优点:精度高...
    99+
    2024-04-02
  • Python机器学习k-近邻算法怎么实现
    这篇文章主要介绍“Python机器学习k-近邻算法怎么实现”,在日常操作中,相信很多人在Python机器学习k-近邻算法怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python机器学习k-近邻算法怎...
    99+
    2023-06-21
  • 机器学习_K近邻Python代码详解
    k近邻优点:精度高、对异常值不敏感、无数据输入假定;k近邻缺点:计算复杂度高、空间复杂度高import numpy as npimport operatorfrom os import listdir# k近邻分类器def classify...
    99+
    2023-01-30
    近邻 详解 机器
  • Python机器学习之手写KNN算法预测城市空气质量
    目录一、KNN算法简介二、KNN算法实现思路三、KNN算法预测城市空气质量1. 获取数据2. 生成测试集和训练集3. 实现KNN算法一、KNN算法简介 KNN(K-Nearest N...
    99+
    2024-04-02
  • Python sklearn转换器估计器和K-近邻算法
    目录一、转换器和估计器1. 转换器2.估计器(sklearn机器学习算法的实现)3.估计器工作流程二、K-近邻算法1.K-近邻算法(KNN)2. 定义3. 距离公式三、电影类型分析1...
    99+
    2024-04-02
  • Python机器学习入门(五)之Python算法审查
    目录1.审查分类算法1.1线性算法审查1.1.1逻辑回归1.1.2线性判别分析1.2非线性算法审查1.2.1K近邻算法1.2.2贝叶斯分类器1.2.3分类与回归树1.2.4支持向量机...
    99+
    2024-04-02
  • python基础中K近邻算法是怎样的
    python基础中K近邻算法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、k-近邻算法原理及API1.k-近邻算法原理如果一个样本在特征空间中的k个最相似(即特征空...
    99+
    2023-06-25
  • Python实现K-近邻算法的示例代码
    目录一、介绍二、k-近邻算法的步骤三、Python 实现四、约会网站配对效果判定五、手写数字识别六、算法优缺点优点缺点一、介绍 k-近邻算法(K-Nearest Neighbour ...
    99+
    2024-04-02
  • python入门之算法学习
    前言 参考学习书籍:《算法图解》[美]Aditya Bhargava,袁国忠(译)北京人民邮电出版社,2017 二分查找 binary_search 实现二分查找的python代码...
    99+
    2024-04-02
  • Python机器学习之AdaBoost算法的示例分析
    这篇文章将为大家详细讲解有关Python机器学习之AdaBoost算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、算法概述AdaBoost 是英文 Adaptive Boosting(自适...
    99+
    2023-06-15
  • python opencv3机器学习之EM算法怎么使用
    今天小编给大家分享一下python opencv3机器学习之EM算法怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-02
  • Python怎么用scikit-learn实现近邻算法分类
    今天小编给大家分享一下Python怎么用scikit-learn实现近邻算法分类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-05
  • Python Tkinter学习之计算器
    初学Python tkinter,利用目前所学编写一个简单的计算器练习一下。预期效果:1.能够实现加减乘除运算,2.只能输入数字3.通过按钮选择进行哪种运算。4.结果框不能修改,智能复制5.按清除按钮能够清除所有内容 from  tkint...
    99+
    2023-01-31
    计算器 Python Tkinter
  • Python机器学习之PCA降维算法的示例分析
    小编给大家分享一下Python机器学习之PCA降维算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、算法概述主成分分析 (Principal Com...
    99+
    2023-06-15
  • Python机器学习算法之决策树算法的实现与优缺点
    目录1.算法概述2.算法种类3.算法示例4.决策树构建示例5.算法实现步骤 6.算法相关概念7.算法实现代码8.算法优缺点9.算法优化总结1.算法概述 决策树算法是在已知各...
    99+
    2024-04-02
  • 机器学习——线性回归-KNN-决策树(实
    1 import numpy as np 2 import pandas as pd 3 from sklearn.linear_model import LinearRegression 4 from sklearn.preproc...
    99+
    2023-01-30
    线性 机器 决策树
  • (机器学习)——使用KNN进行水果分类
    (机器学习)——使用KNN进行水果分类(详解) 实验目标是:导入素材文件fruit_data.txt,使用SKlearn中的neighbors模块对水果数据进行分类,然后预测A、B两种水果的类别。 以...
    99+
    2023-10-26
    分类 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作