Python-机器学习之KNN算法

1.算法知识

KNN(k-Nearest Neighbors)算法是监督学习的典型代表,主要用于分类问题,当我们拥有一个已经分好类的数据集时,我们可以将新的某个数据按照KNN算法分到已有数据集的某一类中去,比如类别有A、B两类,每一类包含的数据如下表:


Python-机器学习之KNN算法_第1张图片
已有分类表.jpg

现在我们得到了一个新的数据点pointX,希望能够判断出pointX应该归入上述两类中的哪一类中去,这时不妨采用KNN算法来实现。

2.算法步骤

  *1 计算新数据点pointX与所有原来数据点point1,...,point14之间的“距离”d(1),...,d(14);
  *2 将1中计算的距离按照升序排列;
  *3 取前k个与新数据点pointX距离最小的原有数据点;
  *4 计算前k小的点所在类别的出现频率;
  *5 返回4中出现频率最高的类别作为新点pointX的类别。

3.Python代码:

from numpy import * import operator def classify(inputPoint,dataSet,labels,k): dataSetSize = dataSet.shape[0] diffMat = tile(inputPoint,(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]

4.代码详解

*1.shape函数
shape函数常用于返回矩阵的行数和列数,如:
a = array([[1,2,3],[3,2,5]]) a.shape (2,3) #表示该矩阵为2行3列; a.shape[0] 2 #索引为0,则返回行数; a.shape[1] 3 #索引为1,则返回列数;

*2.tile函数
tile函数用来将一个数组重复指定次数,并构成一个新数组,如:
a = [1,2,3] b = tile(a,2) b array([1,2,3,1,2,3]) c = tile(a,(2,1)) c array([[1,2,3], [1,2,3]]) #将a横向扩展2次,纵向保持为1次;

*3.sum函数
矩阵调用sum函数时,用axis的值来指定是对行求和还是对列求和,如:
a = array([[1,2,3],[1,2,3]]) x.sum 12 #不指定axis的值,则默认为求总和; x.sum(axis = 1) array([6,6]) #axis=1,则对行求和; x.sum(axis = 0) array([2,4,6]) #axis=0,则对列求和;

*4.argsort函数
argsort函数返回某数组值从小到大的索引值,如:
x = array([4,1,6]) x.argsort() array([1,0,2])

*5.get函数
get函数通过字典的键,来访问对应的值,如果不存在,在不指定返回值的情况下返回一个None;也可以指定不存在时应该返回的值,如下:
pro_Language = {"C#":"microsoft","Java":"Oracle"} print pro_Language.get('python') # 输出:None None print pro_Language.get('python','N/A') #输出:N/A N/A

5.示例测试

`if name == "main" :
dataset = array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
labels = ['A', 'A', 'B', 'B']
X = array([1.2, 1.1])
Y = array([0.1, 0.1])
k = 3
labelX = classify(X,dataset,labels,k)
labelY = classify(Y,dataset,labels,k)
print "Your input is:", X, "and classified to class: ", labelX
print "Your input is:", Y, "and classified to class: ", labelY

Your input is: [ 1.2 1.1] and classified to class: A
Your input is: [ 0.1 0.1] and classified to class: B
`

你可能感兴趣的:(Python-机器学习之KNN算法)