KNN--k近邻算法
训练数据,数据+标签,即已知数据及其分类
当新输入数据即测试数据时,计算与训练类的特征相似距离,作为分类结果
主要算法流程如下:
1.在特征空间中,计算测试数据点与训练数据点的距离;
2.筛选距离最小的训练数据点,对应训练数据类的点数越多,即越可能分作该类;
算法代码如下:
def classify0(inX, dataSet, labels, k):
# 训练数据:dataSet, labels
# 测试数据:inX
# 邻域大小:k
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5 # 上述计算所得测试数据与训练数据各点欧式距离
sortedDistIndices = distances.argsort() # 距离排序
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]] # 距离近的投票制度
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedclassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedclassCount[0][0]
当然,如果多个属性数量级相差较大,容易出现“大数吃小数”的现象,所以可以考虑归一化处理--各特征值减去最小值,再除以极差,代码如下:
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals # 极差
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet = normDataSet / tile(ranges, (m,1)) # 与最小值之差除以极差
return normDataSet, ranges, minVals
应用举例:
问题描述--海伦交往过的男生分为:不喜欢,魅力一般,极具魅力
样本数据--男生的飞行里程数,玩视频游戏时间,每周消费的冰激凌数量
样本标签--不喜欢1,魅力一般2,极具魅力3
eg,【Jack】 (飞行/千米)1000,(游戏/小时)300,(冰激凌/个)20,(标签)1
新给出Boby男的三个特征数量,预测海伦对他的态度