昨天抽空学了一下入门机器学习的比较简单的一个算法,kNN算法。具体这是什么算法的话。。我就不多说了,我这里主要是想将写这个算法代码过程中遇到的一些东西整理一下。
下面先上简单的kNN算法代码
from numpy import *
import operator
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) # 虽然很少。。但也叫做训练数据集
labels = ['A','A','B','B'] # 标签
return group,labels
def classify(inX,dataSet,labels,k): # inX是要用来进行分类的向量 dataSet是训练数据集(通过上面的函数进行获得)labels标签 k选择近邻数目
dataSetSize = dataSet.shape[0] # 获取训练样本集中的向量个数
diffMat = tile(inX,(dataSetSize,1))-dataSet # 将inX待检测向量 扩大为与训练数据集同维度的向量组 进行相减 这样就方便进行下面的计算
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]
然后开始吧(写的很多东西可能是Numpy里面很基础的东西,大牛勿喷 )
1: dataSize = dataSet.shape[0]这里的shape方法。
这里的shape是用来读取矩阵的长度
直接调用shape就返回这个矩阵是多少行,多少列。 shape[0]返回行数,shape[1]返回列数
>>> ee
matrix([[1, 2, 3],
[4, 5, 6]])
>>> ee.shape
(2, 3)
>>> ee.shape[0]
2
>>> ee.shape[1]
3
2:tile()函数。
tile(A,reps),简单的说就是对A进行重复输出,这里的A可以是array 或者是 list 或者是 tuple 等等,可以重复列或者重复行或者行列同时重复
>>> ee
matrix([[1, 2, 3],
[4, 5, 6]])
>>> ee=tile(ee,2)
>>> ee
matrix([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
>>> ee=tile(ee,(2,1))
>>> ee
matrix([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6],
[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
3: argsort()函数,这个函数。。是一个排序函数,就是根据元素的值进行排序,然会返回的是下标。
>>> x=array([1,4,3,-1,6,9])
>>> x.argsort()
array([3, 0, 2, 1, 4, 5])
就先这样吧,周末又来了~
上面如果有不好的地方,希望大家多多指教,我是新手