分类算法:K-近邻算法

一、定义

​ 如果一个样本在特征空间中的k个最相似,即特征空间中最邻近)的样本中的大多数属于某个类别,则该样本也属于这个类别

总结:根据你的“邻居”来推断出你的类别

二、距离公式

1、欧式距离

​ a(a1,a2,a3) b(b1,b2,b3)

​ 计算a、b两点距离:

( a 1 − b 1 ) 2 + ( a 2 − b 2 ) 2 + ( a 3 − b 3 ) 2 \sqrt{(a1-b1)^2+(a2-b2)^2+(a3-b3)^2} (a1b1)2+(a2b2)2+(a3b3)2

2、曼哈顿距离

​ a(a1,a2,a3) b(b1,b2,b3)

​ 计算a、b两点距离:

∣ a 1 − b 1 ∣ + ∣ a 2 − b 2 ∣ + ∣ a 3 − b 3 ∣ |a1-b1|+|a2-b2|+|a3-b3| a1b1+a2b2+a3b3

三、API

  • sklearn. neighbors. KNeighborsClassifier(n_neighbors=5, algorithm=‘auto’)

    • n_ neighbors:int,可选(默认=5),k_ neighbors查询默认使用的邻居数
    • algorithm:{‘auto’,‘ ball tree’, ‘kd_ tree’,’ brute’},可选用于计算最近邻居的算法:‘ ball tree’将会使用 BallTree, kd tree’将使用 KDTree。auto’将尝试根据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)

四、代码实现

鸢尾花数据集:

	from sklearn.datasets import load_iris
	from sklearn.model_selection import train_test_split
	from sklearn.preprocessing import StandardScaler
	from sklearn.neighbors import KNeighborsClassifier
    
    def knn_iris():
	    #1、获取数据
	    iris = load_iris()
	    #2、划分数据集
	    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
	    #3、特征工程:标准化
	    transfer = StandardScaler()
	    x_train = transfer.fit_transform(x_train)
	    x_test = transfer.transform(x_test)
	    #4、KNN算法预估器
	    estimator = KNeighborsClassifier(n_neighbors=22)
	    estimator.fit(x_train,y_train)
	    #5、模型评估
	    #方法1:直接比对真实值和预测值
	    y_predict = estimator.predict(x_test)
	    print("y_predict:\n",y_predict)
	    print("直接比对真实值和预测值:\n",y_test == y_predict)
	    #方法2:计算准确率吧
	    score = estimator.score(x_test,y_test)
	    print("准确率为:\n",score)
	    return None

五、运行结果

y_predict:
 [0 2 0 0 2 1 2 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1
 2]
直接比对真实值和预测值:
 [ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True False  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True False  True
  True  True]
准确率为:
 0.9473684210526315

六、总结

  • 优点

    • 简单,易于理解,易于实现,无需训练
  • 缺点

    • 懒惰算法,对测试样本分类时的计算量大,内存开销大
    • 必须指定K值,K值选择不当则分类精度不能保证
  • 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值