关键词:
一、k-近邻算法概述
1、什么是k-近邻算法
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
2、欧式距离
两个样本的距离可以通过如下公式计算,又叫欧式距离。比方说计算a(a1,a2,a3),b(b1,b2,b3)样本之间的距离:
[sqrt left( a_1 - b_1 ight)^2 + (a_2 - b_2)^2 + (a_3 - b_3) ]
3、实例
我们可以根据一部电影中的某些特征来判断该电影属于什么类别:
我们可以计算未知电影与已知电影的欧式距离,从而判断类别:
按照欧式距离的计算公式计算,比如:
[sqrt left( 18 - 3 ight)^2 + (90 - 104)^2 = 20.5]
根据距离的远近,从而判断未知样本与哪个类别更近,就可以判断未知样本的类别。
二、案例
(一)k-近邻算法API
1、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方法的值来决定最合适的算法。 (不同实现方式影响效率)
(二)k-近邻算法实例(预测入住位置)
1、实例说明
可进入https://www.kaggle.com/c/facebook-v-predicting-check-ins/data查看详情,Facebook创建了一个人工世界,由10万乘10公里的正方形中的100,000多个地方组成。对于给定的一组坐标,您的任务是返回最可能的位置的排名列表。
文件说明:
- train.csv,test.csv
row_id:签到事件的ID
xy:坐标
精度:位置精度
时间:时间戳
place_id:入住位置ID,这是您要预测的目标
其数据形式如下:
row_id x y accuracy time place_id 0 0 0.7941 9.0809 54 470702 8523065625 1 1 5.9567 4.7968 13 186555 1757726713 2 2 8.3078 7.0407 74 322648 1137537235 3 3 7.3665 2.5165 65 704587 6567393236 4 4 4.0961 1.1307 31 472130 7440663949 5 5 3.8099 1.9586 75 178065 6289802927 6 6 6.3336 4.3720 13 666829 9931249544 7 7 5.7409 6.7697 85 369002 5662813655 8 8 4.3114 6.9410 3 166384 8471780938 9 9 6.3414 0.0758 65 400060 1253803156 ...
2、实例解析
显然,xy坐标、位置精度、时间戳是特征值,入住位置是目标值;那么这就是一个分类问题。这个数据量是比较大的,我们可以对其进行如下处理:
- 缩小数据范围(0<x<2,0<y<2)
- 将时间戳转换成年、月、日、时等新的特征
- 删除少于指定位置的签到人数位置删除
然后,再进行特征选取与目标值选取,以及做下面的操作。
3、实现
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import numpy as np def knn(): """ 近邻算法:预测入住位置 :return: """ # 读取训练集数据 df = pd.read_csv("./data/k-近邻算法数据/train.csv") # 读取前5行数据 # print(df.head(5)) """ 一、进行数据处理: 1、缩小数据范围 2、时间戳处理 3、删除少于指定位置的签到人数位置删除 """ # 1、缩小数据范围 df = df.query("x>0 & x<1.2 & y>0 & y<1.23") # 2、时间戳处理 df_time = pd.to_datetime(df["time"], unit=‘s‘) #把日期格式处理成字典格式 time_dict = pd.DatetimeIndex(df_time) # 构造时间特征 df["day"] = time_dict.day df["hour"] = time_dict.hour df["weekday"] = time_dict.weekday # 删除时间戳这一列 df = df.drop([‘time‘], axis=1) # 3、删除少于指定位置的签到人数位置删除 place_count = df.groupby(‘place_id‘).count() # 过滤出少于指定位置的签到人数位置,通过reset_index将索引转成列进行操作 pf = place_count[place_count["row_id"] > 3].reset_index() # 根据指定place_id进行过滤 df = df[df[‘place_id‘].isin(pf[‘place_id‘])] """ 二、获取特征值、目标值 """ # 1、获取特征值 x = df.drop([‘place_id‘], axis=1) # 2、获取目标值 y = df[‘place_id‘] """ 三、进行数据集分割,分成训练集和测试集 """ x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
""" 四、特征工程:标准化 """ sd = StandardScaler() # 对训练集进行标准化 x_train = sd.fit_transform(x_train.astype(np.float64)) # 对测试集进行标准化 x_test = sd.transform(x_test.astype(np.float64))
""" 五、进行KNN算法预测 fit predict score """ knn = KNeighborsClassifier(n_neighbors=5) knn.fit(x_train, y_train) # 预测位置 y_predict = knn.predict(x_test) # print(‘预测的位置:‘,y_predict) # 准确率 predict_accurate = knn.score(x_test, y_test) print(predict_accurate) if __name__ == ‘__main__‘: knn()
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import numpy as np def knn(): """ 近邻算法:预测入住位置 :return: """ # 读取训练集数据 df = pd.read_csv("./data/k-近邻算法数据/train.csv") # 读取前5行数据 # print(df.head(5)) """ 进行数据处理: 1、缩小数据范围 2、时间戳处理 3、删除少于指定位置的签到人数位置删除 """ # 1、缩小数据范围 df = df.query("x>0 & x<1.2 & y>0 & y<1.23") # # 2、时间戳处理 df_time = pd.to_datetime(df["time"], unit=‘s‘) # print(df_time) """ 132 1970-01-08 19:14:45 142 1970-01-02 00:41:22 ... """ # #把日期格式处理成字典格式 time_dict = pd.DatetimeIndex(df_time) # print(time_dict) """ DatetimeIndex( [‘1970-01-08 19:14:45‘, ‘1970-01-02 00:41:22‘, ‘1970-01-07 06:32:23‘, ‘1970-01-02 18:59:24‘,...], dtype=‘datetime64[ns]‘, name=‘time‘, length=417477, freq=None ) """ # 构造时间特征 df["day"] = time_dict.day df["hour"] = time_dict.hour df["weekday"] = time_dict.weekday # 删除时间戳这一列 df = df.drop([‘time‘], axis=1) # print(df) """ row_id x y ... day hour weekday 132 132 0.1902 0.1510 ... 8 19 3 142 142 0.1318 0.4975 ... 2 0 4 149 149 0.0179 0.2321 ... 7 6 2 ... """ # 3、删除少于指定位置的签到人数位置删除 place_count = df.groupby(‘place_id‘).count() # print(place_count) """ row_id x y accuracy day hour weekday place_id 1000213704 22 22 22 22 22 22 22 1000842315 6 6 6 6 6 6 6 1002574526 1 1 1 1 1 1 1 1002803051 1 1 1 1 1 1 1 ... """ # 过滤出少于指定位置的签到人数位置,通过reset_index将索引转成列进行操作 pf = place_count[place_count["row_id"] > 3].reset_index() # print(pf) """ place_id row_id x y accuracy day hour weekday 0 1000213704 22 22 22 22 22 22 22 1 1000842315 6 6 6 6 6 6 6 ... """ # 根据指定place_id进行过滤 df = df[df[‘place_id‘].isin(pf[‘place_id‘])] # print(df) """ 获取特征值、目标值 """ # 1、获取特征值 x = df.drop([‘place_id‘], axis=1) # 2、获取目标值 y = df[‘place_id‘] """ 进行数据集分割,分成训练集和测试集 """ x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) """ 特征工程:标准化 """ sd = StandardScaler() # 对训练集进行标准化 x_train = sd.fit_transform(x_train.astype(np.float64)) # 对测试集进行标准化 x_test = sd.transform(x_test.astype(np.float64)) """ 进行KNN算法预测 fit predict score """ knn = KNeighborsClassifier(n_neighbors=5) knn.fit(x_train, y_train) # 预测位置 y_predict = knn.predict(x_test) # print(‘预测的位置:‘,y_predict) """ [2013736336 4137191191 5861856288 ... 4223174852 8114087113 7163230644] """ # 准确率 predict_accurate = knn.score(x_test, y_test) print(predict_accurate) if __name__ == ‘__main__‘: knn()
可以看出,上面的实现的大致步骤是:获取数据与处理数据-->获取特征值与目标值-->进行数据集切割-->特征工程(标准化、降维等)-->算法预测
三、k-近邻算法的优缺点
1、优点
k-近邻算法的优点很明显,那就是简单、易于理解、易于计算。
2、缺点
- 内存开销大
可以看到,计算两个样本的欧式距离,如果样本数量较大,这样系统的开销比较大。
- k值的选择需慎重
k值在上面的实例过程中体现在KNeighborsClassifier方法的n_neighbors参数,如果这个参数过小,易受到异常点的影响;如果参数过大,那么容易受k值数量的波动。
机器学习之k-近邻(knn)算法(代码片段)
...sp;一.K-近邻算法(KNN)概述 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与... 查看详情
k最近邻算法(代码片段)
KNN算法分类是数据挖掘领域中的一种重要的技术,它是从一组已知的训练样本中发现分类模型,并且使用这个分类模型来预测待分析样本。建立一个有效的分类算法模型最终将待分类的样本进行处理是非常有必要的。目... 查看详情
机器学习机器学习分类算法--k近邻算法knn(下)(代码片段)
六、网格搜索与K邻近算法中更多的超参数七、数据归一化FeatureScaling解决方案:将所有的数据映射到同一尺度 八、scikit-learn中的Scalerpreprocessing.pyimportnumpyasnpclassStandardScaler:def__init__(self):self.mean_=None 查看详情
机器学习之knn(k-近邻算法)(代码片段)
...KNN算法简介 k近邻算法(k-nearestneighbor)是一种基本的分类、回归算法。算法的基本思想是“物以类聚”。也就是说,物体周边事物的类别可以在某种程度上反应该物体的类别。例如,可以通过了解你身边最亲密的几个朋友来... 查看详情
knn最近邻分类算法(代码片段)
...ff0c;该算法简称KNN,采用的方法是最近邻,目的是分类。KNN算法概述在已有数据集中已将数据分为n类,那么如果此时再进来一个新的数据如何给他分类呢?应该选取距离他最近的k个邻居(k由你定),... 查看详情
机器学习-k-近邻算法(代码片段)
...不一样KNN是真滴简单(? ̄△ ̄)?算法介绍KNN属于有监督的分类算法,也就是说,KNN是通过有标签的样本集进行训练,并 查看详情
《机器学习实战》-k近邻算法(代码片段)
...k-近邻算法概述解析和导入数据使用Python导入数据实施kNN分类算法测试分类器使用k-近邻算法改进约会网站的配对效果收集数据准备数据:使用Python解析文本文件分析数据:使用Matplotlib画二维散点图准备数据:归一化数值测试算... 查看详情
r语言学习笔记—k近邻算法(代码片段)
...个样本都可以用它最接近的k个邻居来代表。KNN算法适合分类,也适合回归。KNN算法广泛应用在推荐系统、语义搜索、异常检测。 KNN算法分类原理图:图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆... 查看详情
k-近邻算法(knn)(代码片段)
...sp;一.K-近邻算法(KNN)概述 最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与... 查看详情
转:机器学习算法原理解析-分类(代码片段)
转:http://www.cnblogs.com/swordfall/p/9517988.html常见分类模型与算法距离判别法,即最近邻算法KNN;贝叶斯分类器;线性判别法,即逻辑回归算法;决策树;支持向量机;神经网络;1. KNN分类算法原理及应用1.1 KNN概述K最近邻(k... 查看详情
机器学习实战之第二章k-近邻算法
...法KNN概述k-近邻(kNN,k-NearestNeighbor)算法主要是用来进行分类的.KNN场景电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?动作片:打斗次数更多爱情片:亲吻次数更多基于电影中的亲吻、打斗出现的次... 查看详情
k近邻算法——knn(代码片段)
...这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。所以比较特殊的是它不需要训练,易于理解,易于实现。在KNN中,通过计算对象间距离来... 查看详情
机器学习之监督学习-分类模型k近邻(knn)算法实现(代码片段)
机器学习之监督学习-分类模型K近邻(KNN)算法实现监督学习中常用的分类分类模型有k近邻,逻辑斯谛回归,决策树。今天我们主要学习,K近邻模型。最简单,最初级的分类器就是将全部的训练数据所对应的类别都... 查看详情
基本分类方法——knn(k近邻)算法
...tp://www.cnblogs.com/charlesblc/p/6193867.html1、kNN算法又称为k近邻分类(k-nearestneighborclass 查看详情
分类-knn算法(鸢尾花分类实战)(代码片段)
...介K近邻(KNearestNeighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。“近朱者赤近墨者黑",所谓的K近邻,也就是根据样本相邻最近的K个数据来进行... 查看详情
机器学习算法之knn最近邻详解和python实现(代码片段)
...计算距离注意一定要做数据缩放:归一化和标准化3.分类判别的方式方案算法基本步骤:算法python实现优缺点优点缺点 概念 KNN 查看详情
k-近邻算法(knn)
工作原理:分类算法。输入未标记的新样本时,用算法提取训练样本集中和待分类的样本最近邻的K个分类标签(比如样本只有两个特征,在二维坐标系中用点来表示一个样本,选择和新样本点距离最近的K个点)。选取这k个分类... 查看详情
机器学习实战task1(knn)k近邻算法的应用(代码片段)
...的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。(2)k近邻算法的工作原理给定一个样本的集合,这里称为训练集,并且样本中每个数据都包含标签。对于新输入的一个不包含标签的数... 查看详情