统计学习方法(2)——K近邻模型

本博客只记录实现李航老师《统计学习方法》中讨论的算法,具体的算法流程和推导,请看书中相关章节
这篇博客用最简单的方法实现了K近邻模型
之后会利用KD树实现K-近邻算法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author='icesun'

import numpy as np
from collections import Counter

#距离量度,根据p的不同,生成不同的距离零度
#p=1,曼哈顿距离
#p=2, 欧氏距离
#p为无穷大是,是各个坐标距离的最大值
def distance(p, x1, x2):
    dis = np.float_power(np.sum(np.float_power(x1 - x2, p)), 1 / p)
    return dis

def KNN_classfier(test_datasets, test_labels, train_dataset, train_labels, k, distance):
    # 记录每一个测试样例的预测结果
    prdict = []
    for test_vec in test_datasets:
        # 记录最近k个的距离以及label
        knn_dist_list = []
        knn_label_list = []

        for i in range(len(train_dataset)):
            label = train_labels[i]
            train_vec = train_dataset[i]
            dist = distance(train_vec, test_vec)
            # 前k个训练数据,直接填充到knn列表中
            if i < k:
                knn_dist_list.append(dist)
                knn_label_list.append(label)
            # 后面每一个数据,都要计算与测试数据之间的距离,
            #若果距离小于knn列表中距离的最大值,则替换
            else:
                # 距离最大值
                max_dis = max(knn_dist_list)
                if dist < max_dis:
                    #替换数据
                    max_index = knn_dist_list.index(max_dis)
                    knn_dist_list[max_index] = dist
                    knn_label_list[max_index] = label
        # 对标签进行统计,出现最多的是测试样例对应的label
        label_counts = Counter(knn_label_list)
        prdict.append(label_counts.most_common(1))
    # 计算预测准确率
    acc = np.sum(test_labels == np.array(prdict)) / len(prdict)
    return prdict, acc


#if __name__ == '__main__':
#    a = np.array([1,1,1,1,0])
#    b = np.array([1,1,1,1,1])
#    print(np.sum(a == b))








你可能感兴趣的:(机器学习)