«Машинное обучение на практике» — хорошая вводная книга, связанная с машинным обучением.
Но комментарии многих из приведенных выше кодов не очень подробны, и новичку вроде меня, который не очень хорошо знаком с синтаксисом Xu Python, будет очень сложно понять.
Я прочитал алгоритм K-ближайших соседей, набрал пример кода из книги и добавил подробные комментарии.
import operator
from numpy import *
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 classsify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 以下三行,计算距离
# tile:将inX在行方向重复dataSetSize次,列方向重复1次,也就是生成与dataSet行列数相同的矩阵
diffFMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffFMat**2
# 矩阵 axis=1 每一行相加,axis=0,是每一列相加
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
# 将distances中的元素从小到大排列,提取其对应的index(索引),然后输出到sortedDistIndicies
sortedDistIndicies = distances.argsort()
classCount = {}
# 计算最小的k个点中,有几个A,有几个B,放到一个字典里面
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]
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
print(classsify0([0, 0], group, labels, 3))
Решаемая здесь задача состоит в том, что известно, что в двумерной системе координат имеется 4 точки, из которых две А и две В, и известны их координаты.Найти точку с координатами [0, 0], является ли она принадлежит А или Б.
Ответ: Б
Идея алгоритма K-ближайших соседей для решения этой задачи состоит в том, чтобы выбрать K (3 в коде) точек, ближайших к [0, 0], и посмотреть, есть ли в этих K точках больше A или B. Финал: ([('B', 2), ('A', 1)]), число B велико.