机器学习之KNN算法(B站学习总结)

KNN简介

为了判断未知实例的类别,以所有已知类别的实例作为
参照选择参数K

计算未知实例与所有已知实例的距离(欧式距离)

选择最近K个已知实例

根据少数服从多数的投票法则(majority-voting) ,让
未知实例归类为K个最邻近样本中最多数的类别

算法缺点:
算法复杂度较高(需要比较所有已知实例与要分类的实例)
当其样本分布不平衡时,比如其中一类样本过大(实例数量
过多)占主导的时候,新的未知实例容易被归类为这个主导
样本,因为这类样本实例的数量过大,但这个新的未知实例
实际并没有接近目标样本

算法实践

首先进行数据可视化,数据集分为A,B两类,然后通过计算欧氏距离预测未知X的类别

数据可视化:

import matplotlib.pyplot as plt
import numpy as np
import operator

#已知类A,B的数据
x1 = np.array([3,2,1])
y1 = np.array([104,100,81])
x2 = np.array([101,99,98])
y2 = np.array([10,5,2])
scatter1 = plt.scatter(x1,y1,c='r')
scatter2 = plt.scatter(x2,y2,c='b')
#未知X
x = np.array([18])
y = np.array([90])
scatter3 = plt.scatter(x,y,c='k')

#画图例
plt.legend(handles=[scatter1,scatter2,scatter3],labels=['A类','B类','未知X'],loc='best')
plt.show()

KNN预测:

import matplotlib.pyplot as plt
import numpy as np
import operator

# 已知分类的数据
x_data = np.array([[3,104],
                   [2,100],
                   [1,81],
                   [101,10],
                   [99,5],
                   [81,2]])
y_data = np.array(['A','A','A','B','B','B'])
x_test = np.array([18,90])

# 计算样本数量
x_data_size = x_data.shape[0]

# 复制x_test
np.tile(x_test, (x_data_size,1))

# 计算x_test与每一个样本的差值
diffMat = np.tile(x_test, (x_data_size,1)) - x_data
# 计算差值的平方
sqDiffMat = diffMat**2
# 求和
sqDistances = sqDiffMat.sum(axis=1)
# 开方
distances = sqDistances**0.5

# 从小到大排序
sortedDistances = distances.argsort()

classCount = {}
# 设置k
k = 5
for i in range(k):
    # 获取标签
    votelabel = y_data[sortedDistances[i]]
    # 统计标签数量
    classCount[votelabel] = classCount.get(votelabel,0) + 1
# 得到的classCount为{'A':3,'B':2},也有可能多的不在前面,所以需要排序

# 根据operator.itemgetter(1)-第1个值对classCount排序,然后再取倒序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
# 获取数量最多的标签
knnclass = sortedClassCount[0][0]

转自:https://www.bilibili.com/video/BV1Rt411q7WJ?p=42

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章