- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python机器学习之KNN近邻算法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
简单来说,K-近邻算法采用测量不同特征值之间的距离方法进行分类 。
优点:精度高、对异常值不敏感、无数据输入假定 缺点:计算复杂度高、空间复杂度高 适用数据范围:数值型和标称2型 。
工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系(训练集)。输入没有标签的新数据之后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签(测试集)。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处。(通常k不大于20) 。
我们先写入一段代码 。
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的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。 在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank,但是和线性代数中的秩不是一样的,在用python求线代中的秩中,我们用numpy包中的linalg.matrix_rank方法计算矩阵的秩 线性代数中秩的定义:设在矩阵A中有一个不等于0的r阶子式D,且所有r+1阶子式(如果存在的话)全等于0,那末D称为矩阵A的最高阶非零子式,数r称为矩阵A的秩,记作R(A).
依照KNN算法,我们依次来 。
先准备好四个需要的数据 。
使用欧式距离:
# 返回矩阵的行数dataSetSize = dataSet.shape[0] # 列数不变,行数变成dataSetSize列diffMat = tile(inX, (dataSetSize, 1)) - dataSetsqDiffMat = diffMat ** 2sqDistances = 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:" << 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字符" "为符号进行分割字符串 listFromLine = line.split(" ") # 选取前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 # KNNdef 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: ", y_predict) # 得出预测目标值和真实目标值之间是否相等 print("直接比对真实值和预测值:", y_test == y_predict) # 计算准确率 score = estimator.score(x_test, y_test) print("准确率为:", score)def main(): knn_iris()if __name__ == "__main__": main()
到此这篇关于Python机器学习之KNN近邻算法的文章就介绍到这了,更多相关Python近邻算法内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_48322523/article/details/116596178 。
最后此篇关于Python机器学习之KNN近邻算法的文章就讲到这里了,如果你想了解更多关于Python机器学习之KNN近邻算法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
简介 在上一篇文章《机器学习:神经网络构建(上)》中讨论了线性层、激活函数以及损失函数层的构建方式,本节中将进一步讨论网络构建方式,并完整的搭建一个简单的分类器网络。 目录 网络Netwo
简介 在本篇文章中,我们采用逻辑回归作为案例,探索神经网络的构建方式。文章详细阐述了神经网络中层结构的实现过程,并提供了线性层、激活函数以及损失函数的定义(实现方法)。 目录 背景介绍
简介 在前两篇文章中,我们详细探讨了如何利用采样数据来估计回归曲线。接下来,在本节中,我们将深入讨论如何处理分类问题。 章节安排 背景介绍 数学方法 程序实现 背景介绍 线
简介 在上一篇文章《机器学习:线性回归(上)》中讨论了二维数据下的线性回归及求解方法,本节中我们将进一步的将其推广至高维情形。 章节安排 背景介绍 最小二乘法 梯度下降法 程序
PyCaret是一个开源、低代码Python机器学习库,能够自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具,极大地加快了实验周期,提高了工作效率。PyCaret本质上是围绕几个机器学习
在我的研究进展中,我现在已经将寄生虫从图像中分离出来。寄生虫看起来像蠕虫。我希望 MATLAB 读取所有输入图像,查找类似深紫色图像的蠕虫,如果检测到,则给出检测到的答复。我尝试使用直方图比较,但我认
目前我正在尝试了解机器学习算法的工作方式,但我没有真正了解的一件事是预测标签的计算准确度与视觉混淆矩阵之间的明显差异。我会尽量解释清楚。 这是数据集的片段(这里你可以看到 9 个样本(在真实数据集中大
第一章 绪论 机器学习 : 致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。在计算机系统中, “经验” 通常以“数据“形式存在,因此,机器学习所研究的主要内容,是关于在计算
1. 算法原理(K-Nearest Neighbor) 本质是通过距离判断两个样本是否相似,如果距离够近就认为他们足够相似属于同一类别 找到离其最近的 k 个样本,并将这些样本称
前言 K-means是一种经典的无监督学习算法,用于对数据进行聚类。K-means算法将数据集视为具有n个特征的n维空间,并尝试通过最小化簇内平方误差的总和来将数据点划分为簇。本文将介绍K-m
目录 前言 介绍LightGBM LightGBM的背景和起源 L
前言 可以说掌握了机器学习,你就具备了与机器对话,充分利用机器为人类服务的能力。在人工智能时代,这将成为一项必备技能,就好比十年前你是编程大牛,二十年前你英语超好一样。因此,无论你是什么专业的
几个贯穿始终的概念 当我们把人类学习简单事物的过程抽象为几个阶段,再将这些阶段通过不同的方法具体化为代码,依靠通过计算机的基础能力-- 计算 。我们就可以让机器能够“学会”一些简单的事物。
1、选题背景 人脸识别技术是模式识别和计算机视觉领域最富挑战性的研究课题之一,也是近年来的研究热点,人脸性别识别作为人脸识别技术
每当我们在公有云或者私有云发布训练好的大数据模型,为了方便大家辨识、理解和运用,参照huggingface所制定的标准制作一个Model Card展示页,是种非常好的模型展示和组织形式。 下面就是一
2. 支持向量机 对偶优化 拉格朗日乘数法可用于解决带条件优化问题,其基本形式为: \[\begin{gather} \min_w f(w),\\ \mathrm{s.t.} \quad
我正在尝试运行以下代码: https://github.com/opencv/opencv/blob/master/samples/dnn/classification.cpp 我在这里找到所有经过预
我是机器学习新手。当我使用 scikit-learn 模块中的波士顿数据集练习具有默认参数的决策树回归模型时。 在此链接解决方案( How to Build a Decision tree Regre
我有用于训练的数据。当我将其输入神经网络时,该数据出现 3% 的错误。 我知道这些数据有一定的过度代表性 - 例如,第 5 类的示例大约是其他类的十分之一。 我的作业指出,我可以通过偏置训练数据(即删
我在 Python 的多类分类中使用 SVM 时遇到问题。事实上,问题在于性别分类(来自图像),其中训练数据集仅包含“y=1”或“ y=-1”作为类标签(二进制)。但是,在预测中,如果是男性,我必须预
我是一名优秀的程序员,十分优秀!