機器學習--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] 選擇最近的類別標簽
######################## </p>
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]
</div>
group, labels = create_data_set()
sorted_class_labels = classify0([0, 0], group, labels, 3)
print 'sorted_class_labels=', sorted_class_labels
main()