KNN算法

简介

KNN(K-Nearest Neighbor)最近邻分类算法是数据挖掘中最简单而有效的分类技术之一。它的核心思想类似于“近朱者赤,近墨者黑”,通过依靠邻近样本的类别来判断未知样本的类别。

核心原理

为了对未知样本进行分类,首先将所有已知类别的样本作为参考,计算未知样本与每个已知样本的距离。然后,选取距离未知样本最近的K个已知样本,采用多数投票法则(majority-voting),将未知样本分配到K个最近样本中所占比例较多的类别中。
这就是KNN算法在分类任务中的基本思想,其中K表示选取的最近邻样本的个数。默认是5,一般不大于20。
需要注意的是,KNN算法是一种基于最近邻的分类方法,它不同于判别类域方法,特别适用于存在类域交叉或重叠的待分样本集。

KNN算法关键要点:

  1. 特征可比较的量化: 所有样本特征必须以可比较的数值形式表示。如果存在非数值特征,需通过量化方法将其转换为数值,例如将颜色转换为灰度值,以便进行距离计算。

  2. 样本特征归一化: 样本可能包含多个参数,具有不同的定义域和取值范围,对距离计算产生影响。因此,应对样本参数进行归一化处理,以避免某些参数的影响过大。常用的方法是对所有特征进行归一化处理。

  3. 距离函数选择: 需要选择适当的距离函数来计算样本之间的距离。常用的距离函数包括欧氏距离、余弦距离、汉明距离、曼哈顿距离等。通常情况下,欧氏距离适用于连续变量,而汉明距离适用于非连续变量,如文本分类。

  4. 确定K值: K值的选择很关键。选择过大的K值可能导致欠拟合,而过小的K值可能导致过拟合。应通过交叉验证等方法来确定合适的K值。

KNN算法优缺点总结:

优点:

  1. 简单易懂,易于实现,无需参数估计和训练。
  2. 适用于稀有事件分类。
  3. 特别适合多分类问题,性能比SVM更好。

缺点:

  1. 在样本不平衡时表现不佳。大样本类别可能占据邻居中的多数,导致预测偏向这些大样本类别。
  2. 计算量大,需要对每个待分类样本计算与所有已知样本的距离。

总结

KNN算法是一种简单有效的分类方法,通过选取最近邻样本来进行分类判定。优化KNN算法需要注意数据预处理、距离函数选择和K值确定等关键因素。虽然KNN在一些场景下存在不足,但其在多类别分类和稀有事件分类等方面的优点使其在实际应用中具有广泛价值。

代码

import numpy as np
import matplotlib.pyplot as plt
from collections import Counter

# 数据
# 样本
data_x = [
[1.3, 6],
[3.5, 5],
[4.2, 2],
[5, 3.3],
[2, 9],
[5, 7.5],
[7.2, 4 ],
[8.1, 8],
[9, 2.5]
]

# 分类
data_y = [0, 0, 0, 0, 
          1, 1, 1, 1, 1]

#训练集
x_train = np.array(data_x)
y_train = np.array(data_y)

x1 = x_train[y_train == 0,0]
y1 = x_train[y_train == 0,1]

x2 = x_train[y_train == 1,0]
y2 = x_train[y_train == 1,1]

# 画图
plt.title("KNN")

plt.scatter(x1, y1, color = "orange", marker = "o")
plt.scatter(x2, y2, color = "blue", marker = "x")

# 新的点
data_new = np.array([4, 5])
plt.scatter(data_new[0], data_new[1], color = "purple", marker = "^")

plt.show()

# 计算新的点到旧的点的距离
dist_array = np.array([])
for temp in x_train:
    dist = temp - data_new
    dist = np.sqrt(np.sum(dist * dist))
    print(f'距离为:{dist}')
    dist_array = np.append(dist_array, dist)
    
print(f"dist_array == {dist_array}")
    

# 排序距离
sort_array = np.sort(dist_array)
print(f"sort_array == {sort_array}")
sort_indext_array = np.argsort(dist_array)
print(f"sort_indext_array == {sort_indext_array}")

# 设定k值
k = 5

# 距离最近的k个点投票
first_k = [y_train[i] for i in sort_indext_array[:k]] 
print(f"first_k == {first_k}")

# 列出n个最常见的元素及其从最常见元素开始的计数
c = Counter(first_k).most_common()
ans = c[0][0]
print(f"self ans == {ans}")




# scikit-learn中的KNN算法
from sklearn.neighbors import KNeighborsClassifier

# k的值
knn_obj = KNeighborsClassifier(n_neighbors=5)

# 样本集
knn_obj.fit(x_train, y_train)

# 预测
ans = knn_obj.predict([data_new])

print(f"cikit-learn ans == {ans[0]}")

matplotlib画的图

image.png

打印结果

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容