机器学习--k-近邻(kNN)算法
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
##############################
#功能:将每组数据划分到某个类中
#输入变量:inx, data_set,labels,k
# 分类的向量,样本数据,标签,k个近邻的样本
#输出变量:sorted_class_count[0][0] 选择最近的类别标签
##############################
def classify0(inx, data_set, labels, k):
data_set_size = data_set.shape[0] # 获得数组的行数
# 利用tile(inx, (data_set_size, 1)),在原来的基础上再构造data_set_size*1的inx
# 每行数据相当于某个矢量点的坐标
# 对每行数据进行求和,得到一个data_set_size*1的矩阵
# 最后计算欧式距离
diff_mat = tile(inx, (data_set_size, 1))-data_set
sq_diff_mat = diff_mat**2
sq_distances = sq_diff_mat.sum(axis=1)
distances = sq_distances**0.5
# argsort函数返回的是数组值从小到大的索引值
sorted_dist_indicies = distances.argsort()
class_count = {}
for i in xrange(k):
vote_label = labels[sorted_dist_indicies[i]]
# get相当于一条if...else...语句
# 如果参数vote_label不在字典中则返回参数0,如果vote_label在字典中则返回vote_label对应的value值
class_count[vote_label] = class_count.get(vote_label, 0) + 1
# items以列表方式返回字典中的键值对,iteritems以迭代器对象返回键值对,而键值对以元组方式存储,即这种方式[(), ()]
# operator.itemgetter(0)获取对象的第0个域的值,即返回的是key值
# operator.itemgetter(1)获取对象的第1个域的值,即返回的是value值
# operator.itemgetter定义了一个函数,通过该函数作用到对象上才能获取值
# reverse=True是按降序排序
sorted_class_count = sorted(class_count.iteritems(), key=operator.itemgetter(1), reverse=True)
return sorted_class_count[0][0]
group, labels = create_data_set()
sorted_class_labels = classify0([0, 0], group, labels, 3)
print 'sorted_class_labels=', sorted_class_labels
main()