个人网站允许做内部论坛吗,wordpress 数据库 地址,深圳企业公司网站设计,抖音广告一、算法概念 KNN, K-near neighbor#xff0c;即最近邻算法。它是一种分类算法#xff0c;算法思想是#xff1a;一个样本与数据集中的 k 个样本最相似#xff0c;如果这 k 个样本中的大多数属于某一个类别#xff0c;则该样本也属于这个类别#xff0c;即每个样本都可以…一、算法概念 KNN, K-near neighbor即最近邻算法。它是一种分类算法算法思想是一个样本与数据集中的 k 个样本最相似如果这 k 个样本中的大多数属于某一个类别则该样本也属于这个类别即每个样本都可以用它最接近的 k 个邻居来代表。 KNN 算法的关键点有两个k 值的选择和点距离通常使用欧氏距离的计算。 KNN是一种非参的、惰性的算法模型。 二、基本流程 第一步计算已知类别数据集中的点与当前点之间的距离 第二步按距离递增排序 第三步选取与当前点距离最小的 k 个点 第四步统计前 k 个点所在的类别出现的频率 第五步返回前 k 个点出现频率最高的类别作为当前点的预测分类。
三、K值的选择
1. 近似误差和估计误差 近似误差对现有训练集的训练误差更关注于”训练“ 估计误差对测试集的测试误差更关注于”测试“、”泛化“。 参考近似误差和估计误差
2. k 值的选择 k 值过小相当于用较小领域中的训练实例进行预测学习的近似误差会减小缺点是学习的估计误差会增大预测结果会对近邻的实例点分成敏感如果周围刚好是噪声那么预测就会出错。所以 k 值过小容易发生过拟合可以这么理解k 值过小可用的邻域较小类似于模型训练时训练集小那么容易出现过拟合。 k 值过大相当于用较大邻域中的训练实例进行预测优点是可以减少学习的估计误差但近似误差会增大。 通常通过交叉验证来选取最优的 k 值。详见交叉验证那一篇 blog~
四、优缺点
1. 优点 1简单易用 2模型训练时间快惰性模型不需要对数据作出任何的假设完全根据数据决定 3预测效果好 4对异常值不敏感。
2. 缺点 1计算量较大预测阶段可能较慢 2对内存要求高该算法存储了所有训练数据 3对不相关的功能和数据规模敏感。 总结来说当数据量比较大的时候如果需要用分类算法那么就可以尝试使用 KNN 算法进行分类了。 参考深入浅出KNN算法一 KNN算法原理
五、简单示例
1. 手撕 KNN 算法 参考机器学习之KNNk近邻算法详解
功能根据每部电影内搞笑镜头、拥抱镜头、打斗镜头出现的次数对测试电影样本进行分类分类算法KNN距离计算方式欧氏距离
# 第一步导入函数库
import numpy
import pandas as pd
import math
import matplotlib.pyplot as plt# 第二步确认训练集和测试样本
# 测试样本唐人街探案[23, 3, 17, 片]
# 训练集数据如下
movie_data {宝贝当家: [45, 2, 9, 喜剧片],美人鱼: [21, 17, 5, 喜剧片],澳门风云3: [54, 9, 11, 喜剧片],功夫熊猫3: [39, 0, 31, 喜剧片],谍影重重: [5, 2, 57, 动作片],叶问3: [3, 2, 65, 动作片],伦敦陷落: [2, 3, 55, 动作片],我的特工爷爷: [6, 4, 21, 动作片],奔爱: [7, 46, 4, 爱情片],夜孔雀: [9, 39, 8, 爱情片],代理情人: [9, 38, 2, 爱情片],新步步惊心: [8, 34, 17, 爱情片]
}# 第三步计算测试样本到训练集各个电影的距离
x [23, 3, 17]
dist []
for key, value in movie_data.items():d math.sqrt((x[0]-value[0])**2 (x[1]-value[1])**2 (x[2]-value[2])**2)dist.append([key, round(d, 2)])print(dist)# 第四步对距离大小按递增排序
dist.sort(keylambda dis: dis[1])
print(dist)# 第五步选取距离最小的 k 个样本这里选取 k5
distK5 dist[:5]
print(distK5)# 第六步确定前 k 个样本所在类别出现的频率并输出出现频率最高的类别
label_times {喜剧片: 0, 动作片: 0, 爱情片: 0}
for s in distK5:label movie_data[s[0]][-1]label_times[label] 1print(label_times)print(label_times.items())label_times_sorted sorted(label_times.items(), keylambda l: l[1], reverseTrue)
print(label_times_sorted, label_times_sorted[0][0], sep\n)
几个中间运行结果 1. 测试样本到训练集样本的距离 2. 排序后的距离 3. 离测试样本最近 5 个训练样本的距离 4. 最近的 5 个训练样本的标签出现频率dict 类型 5. dict_items 类型数据 6. 按标签频率排序后的标签及频率list 类型元素为 tuple 类型 7. 测试样本最终标签 2. 调用 Python 函数库
# 第一步导入函数库
from sklearn import neighbors# 第二步确认训练集和测试样本
movie_data {宝贝当家: [45, 2, 9, 喜剧片],美人鱼: [21, 17, 5, 喜剧片],澳门风云3: [54, 9, 11, 喜剧片],功夫熊猫3: [39, 0, 31, 喜剧片],谍影重重: [5, 2, 57, 动作片],叶问3: [3, 2, 65, 动作片],伦敦陷落: [2, 3, 55, 动作片],我的特工爷爷: [6, 4, 21, 动作片],奔爱: [7, 46, 4, 爱情片],夜孔雀: [9, 39, 8, 爱情片],代理情人: [9, 38, 2, 爱情片],新步步惊心: [8, 34, 17, 爱情片]
}
x [23, 3, 17]x_train [v[:3] for key, v in movie_data.items()]
y_train [v[3:][0] for key, v in movie_data.items()]# 第三步训练模型
knn neighbors.KNeighborsClassifier(n_neighbors5)
knn.fit(x_train, y_train)# 第四步测试样本预测
y_train_pre knn.predict(x_train)
y_test_pre knn.predict([x])
3. knn 函数库参数详解
from sklearn import neighborsneighbors.KNeighborsClassifier(n_neighbors5, weightuniform, algorithmauto, leaf_size30, p2, metricminkowski, metric_paramsNone, n_jobs1)# n_neighbors近邻样本个数默认为 5
# weights指定近邻样本的投票权重默认为uniform表示所有紧邻样本的投票权重相同如果为distance则表示投票权重与距离成反比
# algorithm指定近邻样本的搜寻算法如果为ball_tree表示使用球树搜寻法寻找紧邻样本如果为kd_tree表示使用KD树搜寻法寻找紧邻样本如果为brute表示使用暴力搜寻法寻找近邻样本默认为auto表示根据数据特征自动选择最佳的搜寻算法
# leaf_size指定球树或KD树叶子节点所包含的最小样本量用于控制数的生长条件会影响树的查询速度
# metric用于指定距离的度量指标默认为闵可夫斯基距离
# p当参数metric为闵可夫斯基距离时p2表示计算点之间的欧氏距离
# metric_params为metric参数所对应的距离指标添加关键字参数
# n_jobs用于设置knn算法并行计算所需的CPU数量。参考Python 第三方库Knn算法
六、知识点
1. KNN 是监督学习K-means 是无监督学习。
2. 交叉验证 将样本数据按照一定比例拆分出训练用的数据和验证用的数据比如 6:4 拆分出部分训练数据和验证数据从选取一个较小的 k 值开始不断增加 k 的值然后计算验证集合的方差最终找到一个比较合适的 k 值。 详解见【20210922】【机器/深度学习】K折交叉验证k-fold cross validation
3. dict items的用法 dict.items()以列表返回可遍历的 (key, value) 元胞数组。 参考Python 字典(Dictionary) items()方法