Мои заметки по чтению «Практика машинного обучения» (1)

машинное обучение Python

«Машинное обучение на практике» — хорошая вводная книга, связанная с машинным обучением.
Но комментарии многих из приведенных выше кодов не очень подробны, и новичку вроде меня, который не очень хорошо знаком с синтаксисом 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))

图1
Рисунок 1

Решаемая здесь задача состоит в том, что известно, что в двумерной системе координат имеется 4 точки, из которых две А и две В, и известны их координаты.Найти точку с координатами [0, 0], является ли она принадлежит А или Б.
Ответ: Б
Идея алгоритма K-ближайших соседей для решения этой задачи состоит в том, чтобы выбрать K (3 в коде) точек, ближайших к [0, 0], и посмотреть, есть ли в этих K точках больше A или B. Финал: ([('B', 2), ('A', 1)]), число B велико.