AI机器学习与数据挖掘

KNN-算法原理+算法案例

2021-07-11  本文已影响0人  照希
一.算法原理
1.1 核心思想

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样
本中的大多数属于某一个类别,则该样本也属于这个类别,并具有
这个类别上样本的特性。
一般来说,只选择样本数据集中前k个最相似的数据,这就是k-近邻
算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数
据中出现次数最多的分类,作为新数据的分类。
距离度量常见有:欧氏距离(最常用)、曼哈顿距离、夹角余弦。

1.2 算法步骤

✓ 计算已知类别数据集中的点与当前点之间的距离;
✓ 按照距离递增次序排序;
✓ 选取与当前点距离最小的k个点;
✓ 确定前k个点所在类别的出现频率;
✓ 返回前k个点所出现频率最高的类别作为当前点的预测分类。

案例一.k-近邻算法代码实现电影分类

创建数据集和标签,测试集;

dataset=np.array([[1,101],[5,89],[108,5],[115,8]])#四组二维特征
labels = ['爱情片','爱情片','动作片','动作片']

test_data = [101,20]#测试集

定义计算过程

import numpy as np
import collections

def classify(inx_test,dataset,labels,k):
    dist = np.sum((inx_test-dataset)**2,axis=1)**0.5 #计算距离
    k_labels = [labels[index] for index in dist.argsort()[0:k]] # 距离从小到大排列,取k个索引对应k的个最近的标签
    label = collections.Counter(k_labels).most_common(1)[0][0]
    return label

输入数据集,获取测试集标签

#kNN分类
test_class0 = classify(test_data, dataset, labels, 3)
print(test_class0)
案例二.约会网站配对效果判定
2.1 案例背景

✓ 海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约
会网站会推荐不同的人选,但她并不是喜欢每一个人。经过一番总
结,她发现自己交往过的人可以进行如下分类:
• 不喜欢的人
• 魅力一般的人
• 极具魅力的人

✓ 海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文
件datingTestSet.txt中,每个样本数据占据一行,总共有1000行。

海伦收集的样本数据主要包含以下3种特征:
✓ 每年获得的飞行常客里程数
✓ 玩视频游戏所消耗时间百分比
✓ 每周消费的冰淇淋公升数

2.1 数据预览

数据读取

import numpy as np
import pandas as pd

data = pd.read_csv('data\datingTestSet.txt',sep='   ',names=['x1','x2','x3','y'])
datingDataMat = data.loc[:,'x1':'x3']
datingLabels=data.loc[:,'y']

标签只有三种:{'didntLike', 'largeDoses', 'smallDoses'}
但三种特征值的量级不在一个级别,需要对三组特征值做数据归一化处理。


image.png

数据归一化处理。


image.png
上一个案例封装的类,这里可以调用。
#计算错误率
errorCount = 0.0

#前100作为测试,后900个作为训练
for i in range(100):
    classifierResult = classify(df_norm.values[i,:], df_norm.values[100:1001,:],list(datingLabels[100:1001]), 4)
    print("预测结果:%s\t真实类别:%s" % (classifierResult, datingLabels[i]))
    if classifierResult is not datingLabels[i]:
        errorCount += 1.0
print('错误率:%f%%'%(errorCount/float(100)*100))
image.png
案例三.sklearn中的knn-鸢尾花分类
3.1 数据下载
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
##划分数据集特征、标签
iris_X = iris.data
iris_y = iris.target

使用scikit-learn处理划分数据集,并送入模型

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
##划分数据集
iris_train_X,iris_test_X,iris_train_y,iris_test_y = train_test_split(iris_X,iris_y,test_size=0.2,random_state=0)

knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(iris_train_X,iris_train_y)
predict_result = knn.predict(iris_test_X)
print('结果预测为',predict_result)
##计算准确率
acc_rate = knn.score(iris_test_X,iris_test_y)
print('预测准确率为',acc_rate)
3.2 结果
image.png
上一篇 下一篇

猜你喜欢

热点阅读