码迷,mamicode.com
首页 > 编程语言 > 详细

机器学习01-kNN邻近算法

时间:2018-01-15 20:20:18      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:matrix   问题   tin   颜色   ati   return   plot   cloud   最大的   

k-近邻算法

概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类
长处:精度高、对于异常值不敏感。无数据输入假定
缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据。
算法描写叙述:存在一个准确的数据集合样本。称作训练样本集,样本集合中每一个item都附带自己所属分类标签。当须要推断新数据的分类是,仅仅须要计算特征数据和样本数据中最类似的分类标签,选择k个最类似的标签,k个标签中占比最多的即为目标标签。

详细分类算法

    #-*- coding=utf-8 -*-
    from numpy import *
    import operator

    ##简单的kNN算法实现
    #dataSet是训练数据集合。每行代表每一个训练数据的每一个特征值
    #labels 相应dataSet每一个训练数据的class标签
    #inX 表示待分类的特征数据
    def classify0(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0] # 获取測试集合大小
        #求每一个输入特征值和每一个測试集合总的特征值的超时
        #首先须要使用tile将特征值扩展为和測试集合相等大小的矩阵
        diffMat = tile(inX, (dataSetSize, 1)) - dataSet
        #取平方
        sqlDiffMat = diffMat ** 2
        sumMat = sqlDiffMat.sum(axis=1)
        distances = sumMat ** 0.5
        #获取排序信息
        #比如:array([9,1,3,0]) -> array([3,1,2,0]) 升序标签
        sortIndicies = distances.argsort()

        classCount = {}
        #取距离最小的前k个相应的标签统计信息
        for i in range(k):
            label = labels[sortIndicies[i]]
            classCount[label] = classCount.get(label,0) + 1

        #取最大的

        sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True) 
        return sortedClassCount[0][0]

关于特征数据

不同的特征,详细的数据值波动区间是不同的,比如特征A取值范围在[1000,10000],可是特征B取值范围在[0,10],假设直接使用这种特征数据进行KNN算法运算。会出现的一个问题,高区间的特征对结果的影响远远大于低区间的特征值,因此我们须要对我们的特征数据做归一化处理,即将全部特征值处理到同样的区间范围中。


详细算法:((特征值-min)/(max - min)) -> [0,1]区间范围

    from numpy import *
    import operator
    #用于将一个不同范围域的特征值归一化到统一的[0,1]之间
    def normData(dataSet):
        #获取每一个特征的最大值
        maxValue = dataSet.max(0)
        #获取每一个特征的最小值
        minValue = dataSet.min(0)
        ranges=maxValue-minValue
        #将数据归一到同一个范围
        normalDataSet = zeros(shape(dataSet))
        m = dataSet.shape[0]
        normalDataSet = dataSet - tile(ranges,(m,1))
        #除于最大值
        normalDataSet = normalDataSet/tile(maxValue,(m,1))

        return normalDataSet, ranges, minValues

关于可视化特征数据

怎样判别我们取得的特征数据集合适合使用knn进行分类训练?
在做数据观察时我们往往须要通过可视化方式去观察我们的特征数据和label的分布,这个时候就须要用到Python的一个图形工具matplotlib。
特征和分类数据:testSet.txt
3.542485 1.977398 -1
3.018896 2.556416 -1
7.551510 -1.580030 1
2.114999 -0.004466 -1
8.127113 1.274372 1
7.108772 -0.986906 1
8.610639 2.046708 1
2.326297 0.265213 -1
3.634009 1.730537 -1
0.341367 -0.894998 -1
3.125951 0.293251 -1
2.123252 -0.783563 -1
0.887835 -2.797792 -1
7.139979 -2.329896 1
1.696414 -1.212496 -1
8.117032 0.623493 1
8.497162 -0.266649 1
4.658191 3.507396 -1
8.197181 1.545132 1
1.208047 0.213100 -1
1.928486 -0.321870 -1
2.175808 -0.014527 -1
7.886608 0.461755 1
3.223038 -0.552392 -1
3.628502 2.190585 -1
7.407860 -0.121961 1
7.286357 0.251077 1

技术分享图片

可视化脚本:


from numpy import *
import matplotlib
import matplotlib.pyplot as plt

##read file
fr = open(‘testSet.txt‘)
lines = fr.readlines()
dataSet = zeros((len(lines),1))
labels = []
index = 0
for line in lines:
    items = line.strip().split(‘\t‘)
    dataSet[index:] = items[0:2]
    labels.append(items[-1])
#matplot
fx = plt.figure()
ax = fx.add_subplot(111)
#将数组转换为矩阵
dataSet = matrix(dataSet)
colora = tile(50, len(lines))
#这里的colora是为了通过颜色区分不同的labels, cmap代表颜色map,默认是yard, s是每一个点的大小,alpha是每一个点的透明度
ax.scatter(dataSet[:,0], dataSet[:,1], c=colora * labels, cmap=‘autum‘, s=50, alpha=0.3)

plt.show()

机器学习01-kNN邻近算法

标签:matrix   问题   tin   颜色   ati   return   plot   cloud   最大的   

原文地址:https://www.cnblogs.com/zhchoutai/p/8289329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!