1 KNN算法原理。
存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。 输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
示例: 如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
2 案例:
2.1 训练数据及标签
k-近邻算法也可以像我们人一样做到这一点,不同的地方在于,我们的经验更”牛逼”,而k-邻近算法是靠已有的数据。比如,你告诉我这个电影打斗镜头数为2,接吻镜头数为102,我的经验会告诉你这个是爱情片,k-近邻算法也会告诉你这个是爱情片。
注意: knn只是基于历史数据,不会出现其他可能性!
2.2 预测 (101,20)属于什么类型的电影?
![欧氏距离](https://i-blog.csdnimg.cn/blog_migrate/3fd14384d31eb659eb83dd3dcedd5606.png)
实际求 (101,20)所述的最近距离的K个点,判断这K个点中,最多的分类即为预测分类。
3 SKlearn 机器学习python库代码实现:
3.1 SKlearn介绍
Scikit learn 也简称sklearn,是机器学习领域当中最知名的python模块之一。sklearn包含
了很多机器学习的方式:
Classification 分类
Regression 回归
Clustering 非监督分类
Dimensionality reduction 数据降维
Model Selection 模型选择
Preprocessing 数据与处理
使用sklearn可以很方便地让我们实现一个机器学习算法。一个复杂度算法的实现,使
用sklearn可能只需要调用几行API即可。所以学习sklearn,可以有效减少我们特定任务
的实现周期。
3.2 SKLearn Knn算法实现
#KNneighborsClassifier参数说明(共8个参数,不设置即为默认)
# n_neighbors: 默认值5 , 即KNN的k值, 选取最近的 k个点
# weights: 默认uniform ,还有distance. uniform就是所有邻近点的权重是相等的。 distance是不均等的, 距离近的点权重高。
# algorithm: 快速K紧邻搜索算法,默认AUTO,即引擎自动决定合适的算法,也可以指定:
# brute: 蛮力搜索,线性扫描,训练集大比较耗时
# kd_tree: 以中值切分构造二叉树,每个节点是一个超矩阵,维数小于20效率高
# ball_tree:客服 kd_tree高维失效而发明,以质心C和半径r分割样本空间,每个节点是一个超球体
# leaf_size 默认30 ,构造kd ball树大小。影响构建速度和搜索速度,以及存储树所需内存大小
# metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度
量)。
# p:距离度量公式。在上小结,我们使用欧氏距离公式进行距离度量。除此之外,还
有其他的度量方法,例如曼哈顿距离。这个参数默认为2,也就是默认使用欧式距离
公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。
#metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
# n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的
所有cores都用于并行工作。
import numpy as p
from sklearn.neighbors import KNeighborsClassifier as kNN
def createDataSet():
# 四组 二位特征 (动作次数,接吻次数)
group = p.array([[1,101],[5,89],[108,5],[115,8]])
print(type(group))
t = [6,20]
print(type(t))
print(type([[6,20],].reshape(1,-1)))
labels = ['爱情片','爱情片','动作片','动作片']
return group,labels
if(__name__=='__main__'):
group,labels = createDataSet()
neigh = kNN(n_neighbors=3,algorithm='auto') #从近到远的样本,选取前三个, 看三个最近距离的样本中,所属类别最多的即为 预测分类
neigh.fit(group,labels) #拟合历史数据, KNN对训练数据什么都不做,只是加载到内存而已。
classifierResult = neigh.predict([[6,20]])#预测
print(classifierResult) #结果: ['爱情片']