看了很多教程,最终决定安装Anaconda+Pycharm的环境。因为Anaconda中包含了很多库,使用的时候就不用另外手动安装了。而Pycharm作为一款针对Python的编辑器,配置简单,功能强大,使用起来省时省心,对初学者友好,这也是编程验室推荐新手使用Pycharm的原因。
基础安装教程大家可参考:Python环境的安装(Anaconda+Jupyter notebook+Pycharm) - 知乎
如果大家决定安装Anaconda+Pycharm的环境,推荐大家参考这个博主的安装教程,会更具体:Python+Anaconda+PyCharm的安装和基本使用【适合完全零基础】不只是教你如何安装,还告诉你为什么这么安装_哔哩哔哩_bilibili
二、KNN算法 1.算法简介最近邻 (k-Nearest Neighbors, KNN) 算法是一种分类算法, 1968年由 Cover和 Hart 提出, 应用场景有字符识别、 文本分类、 图像识别等领域。
2.算法思想给定测试样本,基于某种距离度量找出在训练集中与其最靠近的k个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或者加权投票,距离越近的样本权重越大。
3. 算法的一般流程1、收集数据:可以使用任何方法。
2、准备数据:距离计算所需要的数值,最好是结构化的数据格式。
3、分析数据:可以使用任何方法。
4、训练算法:此步骤不适用于 K 近邻算法。
5、测试算法:计算错误率。
6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K 近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?
动作片:打斗次数更多
爱情片:亲吻次数更多
基于电影中的亲吻、打斗出现的次数,使用 k-近邻算法构造程序,就可以自动划分电影的题材类型。
现在根据上面我们得到的样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到 k 个距离最近的电影。
假定 k=3,则三个最靠近的电影依次是, He’s Not Really into Dudes 、 Beautiful Woman 和 California Man。
knn 算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。
首先创建一个KNN.py文件,在文件中输入以下代码,代码中,我们导入了两个模块:第一个是科学计算包NumPy;第二个是运算符模块:
from numpy import *
import operator
def createDataSet():
group = array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片']
return group,labels
这里有六组数据,每组数据有两个我们已知的属性以及特征值。现在我们已经知道Python如何解析数据,如何加载数据,以及kNN算法的工作原理,接下来我们将使用这些方法完成分类任务。
实施KNN算法对未知类别属性的数据集中的每个点依次执行以下操作:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现次数;
(5) 返回前k个点出现次数最多的类别作为当前点的预测分类。
代码实现如下:
def calssify0(inX,dataSet,labels,k): #inX为未知类别的新样本,datSet为训练集,labels为训练集的类别标签集合,k为选择距离最近的训练样本的数量
dataSetSize=dataSet.shape[0] #shape[0]会返回数组的行数,shape[1]返回列数
diffMat=numpy.tile(inX,(dataSetSize,1))-dataSet #tile解释参考https://www.jianshu.com/p/9519f1984c70,diffMat数组的每列表示新样本的各列特征值与训练集各列特征值之差
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1) #按列求和
distances=sqDistances**0.5 #平方求和再开方得到最后距离
sortedDistIndicies=distances.argsort() #按照距离远近进行排序,默认为升序,返回相应距离数值对应的位置索引,argsort()函数解释参照https://blog.csdn.net/dz4543/article/details/80219115
classCount={} #创建一个新字典
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]] #得到第i个训练样本的类别标签
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #统计离新样本距离最近的k个训练样本中的类别标签数量。get()函数解释参考https://www.runoob.com/python/att-dictionary-get.html
sortclassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortclassCount[0][0]
三、总结
优点:
1、简单有效
2、重新训练代价低
3、算法复杂度低
4、适合类域交叉样本
5、适用大样本自动分类
缺点:
1、惰性学习
2、类别分类不标准化
3、输出可解释性不强
4、不均衡性
5、计算量较大



