Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用Golang实现K-NN算法

用Golang实现K-NN算法

原创
作者头像
mariolu
发布于 2024-02-08 17:08:50
发布于 2024-02-08 17:08:50
1830
举报

K近邻算法用来对观察数据打标签/分类。通过和已打标样本对比 两者距离,跟哪个样本近就标注该观察数据应该归为什么标签。这通常也是机器学习的一个基础入门算法。

比如说图片这个例子, 这里有5000个28x28像素点阵的灰阶 (0-255) 手写体图像 ,画了数字0到 9。这是部分的示例。

5000个数字图像包括了训练集。并且我们会有一些新的手写体图像,这些还未进行分类打标签。这些未分类图像我们所知的只是灰阶像素点阵。算法工作是通过找到未分类图像在训练集中和哪个样本最接近。最合理的预测就是最接近的图像就是拥有那个样本的标签(所谓的物以类聚)。这也就是预测未知数据。

最接近的方法,就是我们去查找未分类图像和每个样本图片去比较。挨个像素比较,然后汇总所有像素点的比较结果。总体来看,汇总结果差异越小,那么就是越像那个分类。

标准测量差异方法叫做 Euclidean策略。假设两个vectors x⃗, y⃗,向量长度是28 × 28 = 784。包含了8-bit 非负数0…255, 然后定义距离就是

这个问题我们同时给了500个图像来分类, 并且他们是验证集。在跑完所有的验证集的500个数据, 来计算预测准确率 (这里已知标签, 假装不知道他们是如何分类的),

CSV文件包含了训练集和验证集。 每一行对应一个图像. 第一栏是标签, 后面的784栏是每个像素点的灰阶数字.

这里描述的k-近邻分类中的k = 1.

代码语言:go
AI代码解释
复制
package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"strconv"
)

type LabelWithFeatures struct {
	Label    []byte  // 标签
	Features []float64  // 特征列表
}

func NewLabelWithFeatures(parsedLine [][]byte) LabelWithFeatures {  // 读取样本
	label := parsedLine[0]
	features := make([]float64, len(parsedLine)-1)

	for i, feature := range parsedLine {
		// skip label
		if i == 0 {
			continue
		}

		features[i-1] = byteSliceTofloat64(feature)
	}

	return LabelWithFeatures{label, features}  // 返回数据结构
}

var newline = []byte("\n")
var comma = []byte(",")

func byteSliceTofloat64(b []byte) float64 {
	x, _ := strconv.ParseFloat(string(b), 32)
	return x
}

func parseCSVFile(filePath string) []LabelWithFeatures {  // 读取CSV数据,生成样本集的方法
	fileContent, _ := ioutil.ReadFile(filePath)
	lines := bytes.Split(fileContent, newline)
	numRows := len(lines)

	labelsWithFeatures := make([]LabelWithFeatures, numRows-2)

	for i, line := range lines {
		// skip headers
		if i == 0 || i == numRows-1 {
			continue
		}

		labelsWithFeatures[i-1] = NewLabelWithFeatures(bytes.Split(line, comma))
	}

	return labelsWithFeatures
}

func squareDistance(features1, features2 []float64) (d float64) {  
  for i := 0; i < len(features1); i++ {  // 遍历所有特征
    d += (features1[i] - features2[i]) * (features1[i] - features2[i]) // 特征距离平方之和
  }

  return
}

var trainingSample = parseCSVFile("trainingsample.csv")

func classify(features []float64) (label []byte) {
	label = trainingSample[0].Label
	d := squareDistance(features, trainingSample[0].Features)

	for _, row := range trainingSample {  // 在所有样本中 遍历查找
		dNew := squareDistance(features, row.Features)  // 计算未分类数据和样本间的距离
		if dNew < d {  // 找到距离最小的那个样本
			label = row.Label  // 这个样本的标签就是未分类数据的标签
			d = dNew
		}
	}

	return
}

func main() {
	validationSample := parseCSVFile("validationsample.csv")  // 导入样本

	totalCorrect := 0

	for _, test := range validationSample {  // 验证集合
		if string(test.Label) == string(classify(test.Features)) {
			totalCorrect++  // 验证模型预测准确次数+1
		}
	}

	fmt.Println(float64(totalCorrect) / float64(len(validationSample))) // 打印模型预测准确率
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
写给小白:K近邻算法入门
本文的代码,均发布到百度AI Studio的在线平台中,关注微信公众号「老齐教室」,并回复:#真实姓名+手机号+‘案例’#,申请加入含有苯问案例的《机器学习案例》课程,得到包含本案例在内的更多机器学习案例。注意: 回复信息中(1)必须以#开始和结尾(2)必须是真实姓名和手机号。
老齐
2020/05/15
6440
写给小白:K近邻算法入门
Python人工智能 | 七.TensorFlow实现分类学习及MNIST手写体识别案例
前一篇文章讲解了Tensorboard可视化的基本用法,并绘制整个神经网络及训练、学习的参数变化情况。本篇文章将通过TensorFlow实现分类学习,以MNIST数字图片为例进行讲解。本文主要结合作者之前的博客、AI经验和"莫烦大神"的视频介绍,后面随着深入会讲解更多的Python人工智能案例及应用。
Eastmount
2021/12/01
7450
Python人工智能 | 七.TensorFlow实现分类学习及MNIST手写体识别案例
ARKit+Swift 版本的机器学习算法 k-NN
在模式识别领域中,最近邻居法(KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法[1]。在这两种情况下,输入包含特征空间(Feature Space)中的k个最接近的训练样本。
iOSDevLog
2019/04/18
7860
ARKit+Swift 版本的机器学习算法 k-NN
k-NN 剪辑近邻法
理解并掌握基本最邻近法( k-NN )的算法思想以及基本过程,并实现一个 k-NN 算法的函数。
不去幼儿园
2024/12/03
1420
k-NN 剪辑近邻法
【机器学习基础】k近邻算法
  本文就将介绍一个最基本的分类和回归算法:k近邻(k-nearest neighbor, KNN)算法。KNN是最简单也是最重要的机器学习算法之一,它的思想可以用一句话来概括:“相似的数据往往拥有相同的类别”,这也对应于中国的一句谚语:“物以类聚,人以群分”。具体来说,我们在生活中常常可以观察到,同一种类的数据之间特征更为相似,而不同种类的数据之间特征差别更大。例如,在常见的花中,十字花科的植物大多数有4片花瓣,而夹竹桃科的植物花瓣大多数是5的倍数。虽然存在例外,但如果我们按花瓣数量对植物做分类,那么花瓣数量相同或成倍数关系的植物,相对更可能属于同一种类。
Francek Chen
2025/01/22
2360
【机器学习基础】k近邻算法
机器学习算法实践——K-Means算法与图像分割
一、理论准备 1.1、图像分割 图像分割是图像处理中的一种方法,图像分割是指将一幅图像分解成若干互不相交区域的集合,其实质可以看成是一种像素的聚类过程。通常使用到的图像分割的方法可以分为: 基于边缘的技术 基于区域的技术 基于聚类算法的图像分割属于基于区域的技术。 1.2、K-Means算法 K-Means算法是基于距离相似性的聚类算法,通过比较样本之间的相似性,将形式的样本划分到同一个类别中,K-Means算法的基本过程为: 初始化常数 ,随机初始化k个聚类中心 重复计算以下过程,直到聚类中心不再改变
felixzhao
2018/03/14
2.3K0
机器学习算法实践——K-Means算法与图像分割
K-means算法及OpenCV实现
K-means算法MacQueen在1967年提出的,是最简单与最常见数据分类方法之一并且最为一种常见数据分析技术在机器学习、数据挖掘、模式识别、图像分析等领域都用应用。从机器学习的角度看,K-means属于一种无监督的机器学习方法。无监督学习(Unsupervised Learning)简单的说就是在不给定正确答案(标签)的情况下,在数据中找到一些相似的特征用以分析(分类)数据的方法。而在K-means算法解决图像的问题中,就是在对图像的像素点进行分类,达到图像分割的目的。
chaibubble
2022/05/07
7810
K-means算法及OpenCV实现
[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2023/09/01
1.7K0
[Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割
什么是k-NN算法?怎样实现?终于有人讲明白了
作者:阿迪蒂亚·夏尔马(Aditya Sharma)、维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali)、迈克尔·贝耶勒(Michael Beyeler)
IT阅读排行榜
2022/04/14
1.1K0
什么是k-NN算法?怎样实现?终于有人讲明白了
手把手教你用OpenCV实现机器学习最简单的k-NN算法(附代码)
导读:OpenCV 的构建是为了提供计算机视觉的通用基础接口,现在已经成为经典和最优秀的计算机视觉和机器学习的综合算法工具集。作为一个开源项目,研究者、商业用户和政府部门都可以轻松利用和修改现成的代码。
IT阅读排行榜
2019/06/18
1.4K0
手把手教你用OpenCV实现机器学习最简单的k-NN算法(附代码)
A.机器学习入门算法(六)基于天气数据集的XGBoost分类预测
本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc
汀丶人工智能
2023/03/26
1.6K0
A.机器学习入门算法(六)基于天气数据集的XGBoost分类预测
2023-09-05:请用go语言编写。一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]
2023-09-05:请用go语言编写。一个图像有n个像素点,存储在一个长度为n的数组arr里,
福大大架构师每日一题
2023/09/06
2550
2023-09-05:请用go语言编写。一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]
KNN——K最近邻算法以及实例应用
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
鳄鱼儿
2024/05/22
3960
KNN——K最近邻算法以及实例应用
【机器学习】K近邻算法
K近邻算法(K-Nearest Neighbors, KNN)是一种简单但非常实用的监督学习算法,主要用于分类和回归问题。KNN 基于相似性度量(如欧几里得距离)来进行预测,核心思想是给定一个样本,找到与其最接近的 K 个邻居,根据这些邻居的类别或特征对该样本进行分类或预测。
摆烂小白敲代码
2024/11/24
2270
【机器学习】K近邻算法
Machine Learning With Go 第4章:回归
我们将探究的第一组机器学习技术通常被称为回归(regression),我们可以将回归理解为一个变量(例如销售额)的变化是如何影响到其他变量(如用户数)的。对于机器学习技术来说,这是一个很好的开端,它们是构成其他更加复杂技术的基础。
charlieroro
2022/06/02
1.6K0
Machine Learning With Go 第4章:回归
动手造轮子自己实现人工智能神经网络(ANN),解决鸢尾花分类问题Golang1.18实现
    人工智能神经网络( Artificial Neural Network,又称为ANN)是一种由人工神经元组成的网络结构,神经网络结构是所有机器学习的基本结构,换句话说,无论是深度学习还是强化学习都是基于神经网络结构进行构建。关于人工神经元,请参见:人工智能机器学习底层原理剖析,人造神经元,您一定能看懂,通俗解释把AI“黑话”转化为“白话文”。
用户9127725
2023/04/07
7580
动手造轮子自己实现人工智能神经网络(ANN),解决鸢尾花分类问题Golang1.18实现
机器学习(二):有监督学习、无监督学习和半监督学习
一、基本概念 1 特征(feature) 数据的特征。 *举例:书的内容* 2 标签(label) 数据的标签。 *举例:书属于的类别,例如“计算机”“图形学”“英文书”“教材”等。* 3 学习(learning) 将很多数据丢给计算机分析,以此来训练该计算机,培养计算机给数据分类的能力。换句话说,学习指的就是找到特征与标签的映射(mapping)关系。这样当有特征而无标签的未知数据输入时,我们就可以通过已有的关系得到未知数据标签。 *举例:把很多书交给一个学生,培养他给书本分类的能力。* 4 分类(c
海天一树
2018/04/17
1.8K0
机器学习(二):有监督学习、无监督学习和半监督学习
K 近邻法(K-Nearest Neighbor, K-NN)
树相当于不断地用垂直于坐标轴的超平面将 k 维空间切分,构成一系列的k维超矩形区域。
Michael阿明
2020/07/13
1.5K0
【Python】机器学习之聚类算法
这些聚类算法在不同场景和数据特性下有各自的优势和局限性,选择合适的算法取决于问题的性质和对结果的需求。聚类在图像分割、客户细分、异常检测等领域都有广泛的应用。
SarPro
2024/02/20
3870
【Python】机器学习之聚类算法
机器学习算法(一): 基于逻辑回归的分类预测
项目链接参考fork一下直接运行:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc
汀丶人工智能
2023/03/22
5680
推荐阅读
相关推荐
写给小白:K近邻算法入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档