本文共 2026 字,大约阅读时间需要 6 分钟。
K-近邻(待会介绍)的一种极端情况。“近朱者赤,近墨者黑”。
def distance(p0, p1): # Computes squared euclidean distance return np.sqrt(np.sum((p0-p1)**2))def nn_classify(training_set, training_labels, new_example): dists = np.array([distance(t, new_example) for t in training_set]) nearest = dists.argmin() return training_labels[nearest]
将上述的最近邻算法泛化为一个k近邻分类器,不仅考虑最近邻的点,还要考虑前k个最近邻点。k近邻假设给定一个训练数据集,其中的实例类别已定,分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式来进行预测。k近邻不具有显式的学习过程(lazy learning),实际是利用训练数据集对特征向量空间进行划分。
K近邻算法的三个基本要素:
- 距离度量(常用欧式距离或者更一般的Lp距离),见距离度量的Blog。 - 分类决策规则(常用的多数表决,对应于经验风险最小化)。 - k值的选择(k值小时,模型更复杂;k值大,模型更简单;特别的:K=1,最近邻;K=N,无论输入什么,都预测为训练实例中最多的类。交叉检验选最优k值)。def knn_classify(inX, dataset, labels, k): size = dataset.shape[0] diffMat = np.tile(inX, (size, 1)) - dataset sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances ** 0.5 sortedDistIndicies = distances.argsort() classCount={} for i in range(k): votelabel = labels[sortedDistIndicies[i]] classCount[votelabel] = classCount.get(votelabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
X_norm = (X - X_min) / (X_max - X_min )
lambda x: (x - x.min()) / (x.max() - x.min())
def autoNorm(dataset): minVals = dataset.min(0) maxVals = dataset.max(0) ranges = maxVals - minVals normDataset = np.zeros(np.shape(dataset)) m = dataset.shape[0] normDataset = dataset - np.tile(minVals, (m, 1)) normDataset = normDataset / np.tile(ranges, (m, 1)) return normDataset
k近邻由Cover和Hart与1967年提出。Cover T, Hart P. Nearest neighbor pattern classification. IEEE Transactions on Information Theory.
《Building Machine Learning Systems with Python》
《Machine Learning in Action》
《统计学习方法》
《机器学习》