一,KNN算法(K临近算法)
KNN算法是用来解决机器学习三大问题中的分类与回归的基本算法之一,这种算法可以使用已有的数据对尚未进行分类的输入向量进行分类,算法思想大概是如下几步:
1,构造矩阵来计算输入向量与样本集中每个样本之间的距离
2,按照距离递增次序进行排序
3,选取前ķ个距离最小的点
4、通过前ķ个点标签类别的出现频率来确定输入向量的标签类别
我们的核心思想是使用欧氏距离公式求输入向量与样本数据的距离,所以这种算法的适用性于仅在当数据为连续性数据时(数据可以被计算距离时)才能使用
具体代码如下:
# creatDataSet():
# InX=[0,0] 输入向量:被分类的向量 1 x N(数量 x 维度)
# dataSet=array([(1.0,1.2),(1.0,1.0),(0,0),(0,0.1)]) M x N
# labels=array(['A','A','B','B']) 标签向量:训练数据的输出 M x 1
# k=3 最近邻居数目
def classify0(inX,dataSet,labels,k):
#1构造矩阵
dataSetSize =dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSetSize
#2求欧式距离
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
#3对向量进行排序
sortedDisIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDisIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
print(dataSetSize)
解析:
1,#构造矩阵:
col:列表头 row:行表头
(1).shape返回一个矩阵每一维度的长度,例如:一维返回列长度,二维返回(row.len,col.len),以此类推
所以在矩阵中的形状[0]就是行数
(2)区块(一,(行,列))是构建一个将向量一个在一维横向重复COL次后向二维纵向重复排次的矩阵
例如:
瓦((2,3),(2,3))=
[[2,3,2,3,2,3],
[2,3,2,3,2,3]]
2,#求欧氏距离
因为dataSetsize =行数,构造出来的矩阵是和训练矩阵规模相同的,
所以让两矩阵相减后求值后平方求和便是所求的欧氏距离