机器学习之K-近邻算法

什么是K-近邻算法
  1. K-近邻算法(KNN)的原理
          K Nearest Neighbor算法有叫KNN算法。这个算法是机器学习里面一个比较经典的算法,总体来说KNN是相对比较容易理解的算法。
  • 定义
          如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
  • KNN的核心思想是:根据你的“邻居“推断出你的类别。
  • 距离公式
    两个样本的距离可以通过如下公式计算。
    (1)欧式距离:
    例如:a(a1,a2,a3),b(b1,b2,b3)
    ( 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} a1b12+a2b22+a3b32
    (2)曼哈顿距离
    ∣ a 1 − b 1 ∣ + ∣ a 2 − b 2 ∣ + ∣ a 3 − b 3 ∣ \sqrt[]{|a1-b1|+|a2-b2|+|a3-b3|} a1b1+a2b2+a3b3
    (3)名科夫斯基距离(欧式距离和曼哈顿距离是名科夫斯基距离的一个推广)
电影类型分析

假设现在有几部电影:

电影名称打斗镜头接吻镜头电影类型
Cailfornia Man3104爱情片
He’s not Realy into dues2100爱情片
Bautiful Woman181爱情片
Kevin Longblade10110打斗片
Robo Slayer 3000995打斗片
Amped lI982打斗片
1890未知

其中?电影不知道类别,如何去预测?可以使用KNN算法的思想:

电影名称与未知电影的距离
Cailfornia Man20.5
He’s not Realy into dues18.7
Bautiful Woman19.2
Kevin Longblade115.3
Robo Slayer 3000117.4
Amped lI118.9
K-近邻算法API

sklearn.neighbors.KNeighborslassifier(n_neighbors=5,algorithm='auto')

  • n neighbors: int,可选(默认=5) , k_neighbors查询默认使用的邻居
  • algorithm: {‘auto’, ‘ball_tee’, ‘kd_tee’, ‘brute’}, 可选用于计算最近邻居的
    算法: 'ball tree’将会使用BallTree, "kd tree将使用KDTree. 'auto’将尝试根据传递给ft方法的值来决定最合适的算法。(不同实现方式影响效率)
案例1:鸢尾花种类预测
  1. 数据集介绍
          Iris数据集是常用的分类数据集,是一种多重变量分析的数据集,关于数据集的具体介绍:
    在这里插入图片描述
  2. 具体实现过程:
    (1)导入包:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

(2)编写KNN分类函数:

def knn_iris():
    '''
    用KNN算法对鸢尾花进行分类
    :return:
    '''
    # 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=3)
    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

(3)调用 knn_iris()函数:

if __name__ == "__main__":
    # 代码1:用KNN算法对鸢尾花进行分类
    knn_iris()

(4)结果:
在这里插入图片描述
3. 结果分析:

  • k值取多大?有什么影响?
    k值取得过小,容易受异常值的影响。k之取得过大。容易受到样本不均衡的影响。
  • 性能问题
    距离计算上面,时间复杂度高
  1. 总结
    优点:简单,易于理解,易于实现,无需训练
    缺点:
    (1)懒惰算法,对测试样本分类时的计算量大,内存开销大
    (2)必须指定K值,K值选择不当则分类精度不能保证
    使用场景:
    小数据集,几千~几万样本,具体场景具体业务去测试。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值