人工智能入门 | 分类算法-KNN(原理+代码+结果)

前言:Hello大家好,我是小哥谈。KNN,即K最邻近算法,是数据挖掘分类技术中比较简单的方法之一,简单来说,就是根据“最邻近”这一特征对样本进行分类。🌈

     目录

🚀1.K-means和KNN区别

🚀2.KNN的算法思想

🚀3.算法步骤

🚀4.KNN算法的优缺点

🚀5.数据集

🚀6.代码实现

🚀7.结果

🚀1.K-means和KNN区别

K-means是一种比较经典的聚类算法,本质上是无监督学习,而KNN是分类(或回归)算法,是监督学习

K-means算法的训练过程需要反复迭代的操作(寻找新的质心),但是KNN不需要。K-means中的 K 代表的是簇中心,KNN的 K 代表的是选择与新测试样本距离最近的前K个训练样本数。🌳


🚀2.KNN的算法思想

KNN(k-NearestNeighbor)又被称为近邻算法,它的核心思想是:物以类聚,人以群分

假设一个未知样本数据x需要归类,总共有ABC三个类别,那么离x距离最近的有k个邻居,这k个邻居里有k1个邻居属于A类,k2个邻居属于B类,k3个邻居属于C类,如果k1>k2>k3,那么x就属于A类,也就是说x的类别完全由邻居来推断出来。🌳


🚀3.算法步骤

🍀(1)计算测试对象到训练集中每个对象的距离

🍀(2)按照距离的远近排序

🍀(3)选取与当前测试对象最近的K的训练对象,作为该测试对象的邻居。

🍀(4)统计这K个邻居的类别概率

🍀(5)K个邻居里频率最高的类别,即为测试对象的类别。


🚀4.KNN算法的优缺点

优点:非常简单的分类算法没有之一,人性化,易于理解,易于实现适合处理多分类问题,比如推荐用户

缺点:属于懒惰算法,时间复杂度较高,因为需要计算未知样本到所有已知样本的距离,样本平衡度依赖高,当出现极端情况样本不平衡时,分类绝对会出现偏差。可解释性差,无法给出类似决策树那样的规则。向量的维度越高,欧式距离的区分能力就越弱。


🚀5.数据集

名称:Prostate_Cancer

提取链接:https://pan.baidu.com/s/1xv8r54qaLpH8RiMRkcrzyA 
提取码:66hg 

数据集展示:


🚀6.代码实现

from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import random
import pandas as pd

def knn():
    K = 8
    data=pd.read_csv(r"C:\Users\Lenovo\Desktop\course\Prostate_Cancer.csv")
    n = len(data) // 3
    test_set = data[0:n]
    train_set = data[n:]
    train_set = np.array(train_set)
    test_set = np.array(test_set)
    A = [i for i in range(0, len(train_set))]
    B = [i for i in range(2, 10)]
    C = [i for i in range(n)]
    D = [1]
    x_train = train_set[A]
    x_train = x_train[:, B]
    y_train = train_set[A]
    y_train = y_train[:, D]
    x_test = test_set[C]
    x_test = x_test[:, B]
    y_test = test_set[C]
    y_test = y_test[:, D]
    # 训练模型
    model = KNeighborsClassifier(n_neighbors=K)
    model.fit(x_train, y_train)
    score = model.score(x_test, y_test)
    print("准确率为:", score)

if __name__=='__main__':
    knn()


🚀7.结果

k=8时候,结果为0.7575757575757576

k=5时候,结果为0.8181818181818182

总结:♨️♨️♨️

KNN是一种快速高效的分类算法,其逻辑简单,易于理解。但当训练数据集很大时,需要大量的存储空间,而且需要计算训练样本和测试样本的距离,计算量较大。个人认为,这是由于KNN是一种懒惰的学习法,简单的认为“物以类聚,人以群分”,但实际上,无论是人际交往还是数据事实,可能并不完全符合这个逻辑


  • 8
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 分别基于贝叶斯、BP神经网络、KNN进行邮件入侵分类检测python源码+详细项目说明+数据集+模型.zip 邮件分类(贝叶斯+SVM) classify.py ### Prerequisites - Python3 - pandas - pyecharts>=1.0.0 - snapshot_selenium - skleran ### Getting Start --- ```python classify.py``` 一共三种分类方法:KNN、高斯贝叶斯和BP神经网络,后来也加上了决策树 三种方法一同进行并输出分类结果 ### Result 分别展示二分类和五分类下的结果与分析。其中交叉验证法的折数均设为5。 因为个人电脑的原因,一共只抽取原数据集的20%约8w条数据包作为训练集和测试集,其中测试集 占20%。 #### 二分类 **交叉验证法** **KNN参数设定** 在这里我一共选取了K等于3、5、7、9、11、13、15这几种情况,分别测试他们的平均准确率,如下 图所示: <img src="img.asserts/1593583426178.png" alt="1593583426178" style="zoom:67%;" 整体效果是不错的,其中K=3和K=5时平均准确率最高,最终选择**K=3**作为二分类下的KNN算法的K值。 **决策树参数设定** 首先是```max_depth```,范围为10到30,各值设定下的正确率如下所示: <img src="img.asserts/1593582724875.png" alt="1593582724875" style="zoom:67%;" 可以看到等于26和30的时候最高,这里取值为**26**,在此设定下,在对测试范围为2到20的进行正确率的检测,如下: <img src="img.asserts/1593582778823.png" alt="1593582778823" style="zoom:67%;" 最终min_samples_split设定为 **2**。 **性能评价** 首先先看各模型下的混淆矩阵: <img src="img.asserts/1593582820570.png" alt="1593582820570" style="zoom:67%;" 下面是各模型的准确率、精确率、召回率和F1-Score(这里我将结果都扩大了100倍): <img src="img.asserts/1593582840738.png" alt="1593582840738" style="zoom:67%;" 最后是ROC曲线和P_R曲线: | **ROC** | **P_R** | | ---------------------------- | ---------------------------- | | ![img](img.asserts/wps8.png) | ![img](img.asserts/wps9.png) | ROC曲线中,每一个模型的AUC面积保留两位小数点后均为1,包括P_R曲线中也不好看出模型之间的区别,而由混淆矩阵的结果也不难看出,这几个模型的分类结果均较好,并且正确率等指标也在94% 之上,但总的来说其中KNN表现得最好。当然这四个模型都存在着将正常数据包和异常数据包识别成对方的情况。 #### **五分类** **交叉验证法** **KNN参数设定** 测试的K值和折数的设定与二分类一致。每个K值对应的平均准确率如下: <img src="img.asserts/1593582921181.png" alt="1593582921181" style="zoom:67%;" 根据该结果,五分类下的KNN算法的K值同样设定为**3**。 **决策树参数设定** 首先是```max_depth```参数,取值范围10到30,正确率如下:
以下是DPC-KNN-PCA算法的Python完整代码,包括数据预处理、DPC-KNN-PCA算法实现和结果可视化: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt # 数据预处理 data = pd.read_csv('data.csv') X = data.values[:, :-1] y = data.values[:, -1] # DPC-KNN-PCA算法实现 def DPC_KNN_PCA(X, k, alpha, beta, gamma): n, m = X.shape D = np.zeros((n, n)) for i in range(n): for j in range(n): D[i, j] = np.linalg.norm(X[i] - X[j]) D_sort = np.sort(D, axis=1) idx_sort = np.argsort(D, axis=1) K = np.zeros((n, k)) for i in range(n): for j in range(k): K[i, j] = idx_sort[i, j+1] W = np.zeros((n, n)) for i in range(n): for j in range(k): W[int(K[i, j]), i] = 1 W = np.maximum(W, W.T) D_bar = np.diag(np.sum(W, axis=1)) L = D_bar - W M = np.dot(X.T, L).dot(X) [U, S, V] = np.linalg.svd(M) U_pca = U[:, :2] Z = np.dot(X, U_pca) L_pca = np.dot(U_pca.T, M).dot(U_pca) D_pca = np.diag(np.sum(L_pca, axis=1)) L_norm = np.linalg.inv(np.sqrt(D_pca)).dot(L_pca).dot(np.linalg.inv(np.sqrt(D_pca))) W_norm = np.exp(-alpha*L_norm) - np.eye(n) D_norm = np.diag(np.sum(W_norm, axis=1)) L1_norm = D_norm - W_norm L2_norm = np.linalg.inv(np.sqrt(D_norm)).dot(L_norm).dot(np.linalg.inv(np.sqrt(D_norm))) W_dpc = np.exp(-beta*L1_norm - gamma*L2_norm) - np.eye(n) D_dpc = np.diag(np.sum(W_dpc, axis=1)) L_dpc = D_dpc - W_dpc return Z, L_dpc # 运行DPC-KNN-PCA算法并可视化结果 Z, L_dpc = DPC_KNN_PCA(X, 10, 0.5, 0.1, 0.1) plt.scatter(Z[:, 0], Z[:, 1], c=y) plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哥谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值