4782|17

552

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

《机器学习算法与实现》1、k最近邻算法 [复制链接]

 
本帖最后由 xinmeng_wit 于 2024-7-2 21:28 编辑

一、本书介绍

在正式开始之前还是想先介绍以下这本书,本书的名称是《机器学习算法与实现——Python编程与应用实例》,作者布树辉是西北工业大学的教授,也是很厉害的人物。

本书总共有11章,我觉得主要可以分为3大块,第一部分是Python语言的基础知识;第二部分是机器学习的基础算法及实现;第三部分为深度学习及目标检测。

从内容可以看出来,本书层次感非常强,由浅入深,循序渐进。

另外,本书还配有视频教程和电子档的资料,b站就能免费观看。

最后,本书的质感还是可以的,彩版印刷,看起来相当舒服。

 

二、KNN算法介绍

书籍的基本信息介绍完毕后我们开始切入正体,这篇主要来学习机器学习中最简单的算法:k最近邻算法。有的书本上也叫做k近邻算法,我觉得叫做k最近邻算法更准确,因为英文原文是k-Nearest Neighbor,简称KNN。

KNN既可以用来解决分类问题,也可以用来解决回归问题。

KNN的核心思想是:通过度量给定样本到训练集中所有样本的特征距离,将与给定样本特征距离最近的k个样本中出现次数最多的类别指定为该样本最优估计的类别。

我的理解是:如果想要确定某个样本x属于那一种类型,只需要看与之最近的k个样本的类型,然后找出最多的那个类型,那么x就属于这个类型,其中k需要根据实际情况来选取。

 

如图,如果要确定Xu是属于w1,w2还是w3,如果k取5,那么只需要统计与它最近的5个点的属性,其中4个是红色(w1),那么Xu就确定为红色(w1)。

没错KNN算法就是这么简单,所以KNN算法基本上只涉及到欧式距离的计算。

 

三、数据生成

在正式编写算法之前,首先需要准备数据,接下来,我们自己通过python生成一些模拟数据。

import numpy as np
import matplotlib.pyplot as plt

# 生成模拟数据
np.random.seed(314)

data_size1 = 100

x1 = np.random.randn(data_size1, 2) + np.array([4,4])
y1 =[0 for _ in range(data_size1)]

data_size2 = 100

x2 = np.random.randn(data_size2, 2) * 2 + np.array([10, 10])
y2 = [1 for _ in range(data_size2)]

# 合并生成全部数据
x = np.concatenate((x1, x2), axis=0)
y = np.concatenate((y1, y2), axis=0)

data_size_all = data_size1 + data_size2
shuffled_index = np.random.permutation(data_size_all)
x = x[shuffled_index]
y = y[shuffled_index]

# 分割训练集和测试集
split_index = int(data_size_all * 0.7)
x_train = x[:split_index]
y_train = y[:split_index]
x_test = x[split_index:]
y_test = y[split_index:]


# 绘制结果
plt.scatter(x_train[:,0], x_train[:,1], c= y_train, marker='.')
plt.title("训练数据")
plt.show()

plt.scatter(x_test[:,0], x_test[:,1], c= y_test, marker='.')
plt.title("测试数据")
plt.show()

详细的python代码就不一一解释了,都是python语法,代码运行后,就会分别生成训练集和测试集,训练集占70%,测试集占30%,训练集+测试集一共200个。

数据可视化:

 

这个是训练集:

 

这个是测试集:

 

四、程序实现

数据准备好后,就可以尝试自己实现该程序了。

正式开始之前,再来梳理一下思路:

1、计算测试数据与个训练数据之间的距离

2、确认k个点中不同类别出现的频率,出现最多的的类即为测试数据的类别

 

可以实现三个函数,kNN_distance, kNN_vote,kNN_predict分别计算距离,投票,和预测。

# -------程序实现
def kNN_distance(v1, v2):
    '''计算两个多维向量的距离'''
    return np.sum(np.square(v1 - v2))

def kNN_vote(ys):
    '''根据ys的类别, 挑选类别最多的一类作为输出'''
    vote_dict = {}
    for y in ys:
        if y not in vote_dict.keys():
            vote_dict[y] = 1
        else:
            vote_dict[y] += 1

    # 找到类别最多的一类,也可以用循环遍历的方式来找,这里使用了max函数来直接返回值最大的键
    max_key =  max(vote_dict, key=lambda k: vote_dict[k])
    return max_key

def kNN_predict(x, train_x, train_y, k=3):
    '''
    针对指定的数据进行分类,参数:
    x - 输入的待分类样本
    train_x - 训练数据的样本
    train_y - 训练数据的标签
    k - 最近邻的样本数
    '''
    dist_arr = [kNN_distance(x, train_x[j]) for j in range(len(train_x))]
    sorted_index = np.argsort(dist_arr)
    top_k_index = sorted_index[:k]
    ys = train_y[top_k_index]
    return kNN_vote(ys)

然后分别对训练集和测试集进行预测,并计算精度:
 

 对训练集的样本进行分类
y_train_test = [kNN_predict(x_train[i], x_train, y_train) for i in range(len(x_train))]
print(y_train_test)

# 统计训练精度
n_correct = 0
for i in range(len(x_train)):
    if y_train_test[i] == y_train[i]:
        n_correct += 1

accuracy = n_correct / len(x_train) * 100.0
print("Train Accuracy: %f%%" % accuracy)

# 对测试集的样本进行分类
y_train_test = [kNN_predict(x_test[i], x_train, y_train) for i in range(len(x_test))]

# 统计训练精度
n_correct = 0
for i in range(len(x_test)):
    if y_train_test[i] == y_test[i]:
        n_correct += 1

accuracy = n_correct / len(x_test) * 100.0
print("Test Accuracy: %f%%" % accuracy)

运行结果:

Train Accuracy: 100.000000%
Test Accuracy: 96.666667%

五、其它

上面我们自己实现了KNN算法,但是自己实现的算法总规不是那么完美,比如在运行效率上面可能不是太好,数据量很大的时候会非常慢。

其实有很多机器学习框架都提供了非常好用的常用算法接口,比如sklearn,可以直接调用,并不需要重复造轮子,我们自己尝试实现KNN算法更多地是为了加深对KNN算法的理解。

关于sklearn的例子,书中也有描述和代码,这里就不照搬了。

最新回复

《机器学习算法与实现》值得好好学习体会,多谢提供   详情 回复 发表于 2024-7-27 11:46
点赞 关注

回复
举报

6993

帖子

11

TA的资源

版主

沙发
 
其实我现在还不懂KNN的原理是什么,一直还没有入门过。

点评

大概意思就是如果要确定一个人说什么语言,只需要看他几个邻居说什么语言就能预测出他说什么语言  详情 回复 发表于 2024-7-3 22:31
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2024-7-3 06:54 其实我现在还不懂KNN的原理是什么,一直还没有入门过。

大概意思就是如果要确定一个人说什么语言,只需要看他几个邻居说什么语言就能预测出他说什么语言


点评

这挺好的,现在很流行这些算法,不知道从哪里可以拿到入门的学习资料。  详情 回复 发表于 2024-7-4 07:44
 
 
 

回复

6993

帖子

11

TA的资源

版主

4
 
xinmeng_wit 发表于 2024-7-3 22:31 大概意思就是如果要确定一个人说什么语言,只需要看他几个邻居说什么语言就能预测出他说什么语言

这挺好的,现在很流行这些算法,不知道从哪里可以拿到入门的学习资料。

 
 
 

回复

1385

帖子

1

TA的资源

五彩晶圆(初级)

5
 

个人理解:

已有多个类别,现在一个新sample,它该分在哪个类别里呢?

KNN的做法就是,让这个新sample和所有样本求距离,然后根据距离升序排序,最前面的K个样本中,哪个类别的样本数最多,新sample就加入那个类别。

 

问题是,K到底选多少为宜呢?

点评

k的选取确实很重要,不能太大,也不能太小,只能根据实际情况动态去调整  详情 回复 发表于 2024-7-4 21:26
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

6
 
hellokitty_bean 发表于 2024-7-4 12:49 个人理解: 已有多个类别,现在一个新sample,它该分在哪个类别里呢? KNN的做法就是,让这个新sampl ...

k的选取确实很重要,不能太大,也不能太小,只能根据实际情况动态去调整

 
 
 

回复

209

帖子

1

TA的资源

一粒金砂(高级)

7
 

看的还是有点云里雾里的,很迷茫,看来还没有入门

点评

可以去b站看看视频教程  详情 回复 发表于 2024-7-8 12:57
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

8
 
851779592 发表于 2024-7-8 10:07 看的还是有点云里雾里的,很迷茫,看来还没有入门

可以去b站看看视频教程


点评

有什么推荐的视频课吗,这些算法在实际应用中有什么好的使用吗  详情 回复 发表于 2024-7-11 09:15
 
 
 

回复

308

帖子

0

TA的资源

纯净的硅(初级)

9
 

原理不难,但是距离函数的选取很重要,严重影响结果和性能。

点评

距离公式我还停留在初等数学的距离公式上,如果关键在于它,那它一定还有多种选择了?  详情 回复 发表于 2024-7-9 09:05
 
 
 

回复

1385

帖子

1

TA的资源

五彩晶圆(初级)

10
 
13620203064 发表于 2024-7-8 16:19 原理不难,但是距离函数的选取很重要,严重影响结果和性能。

距离公式我还停留在初等数学的距离公式上,如果关键在于它,那它一定还有多种选择了?

 
 
 

回复

4932

帖子

19

TA的资源

版主

11
 
这个选取范围很重要 而且多维以后 很难找到最接近的了,尤其是互相包括的
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

12
 

看来都是高手啊

 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

13
 

 

这挺好的,现在很流行这些算法,不知道从哪里可以拿到入门的学习资料

点评

可以留意一下论坛的书籍评测活动  详情 回复 发表于 2024-7-10 18:48
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

14
 
黄佳庆 发表于 2024-7-9 20:51   这挺好的,现在很流行这些算法,不知道从哪里可以拿到入门的学习资料

可以留意一下论坛的书籍评测活动


 
 
 

回复

209

帖子

1

TA的资源

一粒金砂(高级)

15
 
xinmeng_wit 发表于 2024-7-8 12:57 可以去b站看看视频教程

有什么推荐的视频课吗,这些算法在实际应用中有什么好的使用吗

点评

搜索一下,有很多讲机器学习的视频  详情 回复 发表于 2024-7-11 12:32
 
 
 

回复

552

帖子

3

TA的资源

纯净的硅(初级)

16
 
851779592 发表于 2024-7-11 09:15 有什么推荐的视频课吗,这些算法在实际应用中有什么好的使用吗

搜索一下,有很多讲机器学习的视频


点评

好好,多谢啦。我去找找看看试试吧。还得多学习学习  详情 回复 发表于 2024-7-11 14:45
 
 
 

回复

209

帖子

1

TA的资源

一粒金砂(高级)

17
 
xinmeng_wit 发表于 2024-7-11 12:32 搜索一下,有很多讲机器学习的视频

好好,多谢啦。我去找找看看试试吧。还得多学习学习

 
 
 

回复

227

帖子

0

TA的资源

一粒金砂(高级)

18
 

《机器学习算法与实现》值得好好学习体会,多谢提供

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表