本章内容
- k-近邻分类算法
- 从文本文件中解析和导入数据
- 使用Matplotlib创建扩散图
- 归一化数值
k-近邻算法描述
k-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高,对异常值不敏感,无数据输入假定 |
缺点:计算复杂度高,空间复杂度高。 |
适用数据范围:数值型和标量型。 |
工作原理:存在一个样本数据集合,即训练样本集,并且样本集中每个数据都存在标签,也就是我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的分类标签。,一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中的k的出处。通常K是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
实施kNN算法
伪代码如下:
对未知类别属性的数据集中的每个点依次执行一下操作:
- 计算已知类别数据集中的点与当前点之间的距离
- 按照距离递增次序排序
- 选取与当前点距离最小的k个点;
- 确定前k个点所在类别的出现频率;
- 返回前k个点出现频率最高的类别作为当前点的预测分类。
k-近邻算法python代码实现
def classify0(inx,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=np.tile(inx,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]-classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
这样我们就构造出了一个分类器,那么你构造的分类器是好是坏呢?
cklearn.neighbors.KNeighborsClassifier 对KNN算法进行了封装,可以直接调用
- n_neighbors:临近点个数
- p:距离度量
- algorithm:近邻算法,可选{‘auto’,‘ball_tree’,‘kd_tree’,'brute'}
- weights:确定近邻的权重
如何测试分类器
为了测试分类器的效果,我们可以使用已知答案的数据,检验分类器给出的结果是否符合预期效果。通过大量的测试数据,我们可以得到分类器的错误率——分类器给出的错误结果的次数除以测试执行的总数。完美分类器的错误率为0,最差分类器的错误率是1.0.
原理搞完,下面就要运用到实践中:案例分析
给海伦找合适的约会对象
通过分析总结出她曾经交往过三种类型的人:(分析数据)
- 不喜欢的人
- 魅力一般的人
- 极具魅力的人
(目的)没有目的何来办事!!!这个女人想在周一到周五约会哪些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴,她想我们的分类软件可以更好的帮助她将匹配对象划分到确切的分类中去,她还收集了一些未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类
(1) 收集数据:提供文本文件。 |
(2) 准备数据:使用Python解析文本文件。 |
(3) 分析数据:使用Matplotlib画二维扩散图。 |
(4) 训练算法:此步骤不适用于k-近邻算法 |
(5) 测试算法:使用海伦提供的部分数据作为测试样本。 测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类 与实际类别不同,则标记为一个错误。 |
(6) 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否 为自己喜欢的类型。 |
没了,截图啥的都没有了,没啥记录了重点在上面了