机器学习之KNN

机器学习之KNN

约会问题为例,展示整个算法工作流程

源代码

注:这里使用的是python语言

import numpy as np
import operator

def read_data(file_path):
    fr = open(file_path)
    file_lines = fr.readlines()
    data_num = len(file_lines)
    dataset = np.zeros((data_num, 3))
    class_vec = []
    index = 0
    for line in file_lines:
        line_split = (line.strip()).split('\t')
        dataset[index, :] = line_split[:-1]
        class_vec.append(line_split[-1])
        index += 1
    return dataset, class_vec

def data_classify(dataset, class_vec):
    type1 = [[], [], []]
    type2 = [[], [], []]
    type3 = [[], [], []]
    labels = list(set(class_vec))
    
    for i in range(len(dataset)):
        if class_vec[i] == labels[0]:
            type1[0].append(dataset[i,0])
            type1[1].append(dataset[i, 1])
            type1[2].append(dataset[i, 2])
        elif class_vec[i] == labels[1]:
            type2[0].append(dataset[i,0])
            type2[1].append(dataset[i, 1])
            type2[2].append(dataset[i, 2])
        elif class_vec[i] == labels[2]:
            type3[0].append(dataset[i,0])
            type3[1].append(dataset[i, 1])
            type3[2].append(dataset[i, 2])

    return type1, type2, type3, labels

def view_data(dataset, class_vec):
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif'] = ['Simhei']
    plt.rcParams['axes.unicode_minus'] = False
    type1, type2, type3, labels = data_classify(dataset, class_vec)
    fig1 = plt.figure(figsize=(30, 10))

    axe1 = plt.subplot(1, 3, 1)
    axe1.scatter(type1[0], type1[1])
    axe1.scatter(type2[0], type2[1])
    axe1.scatter(type3[0], type3[1])
    plt.legend(labels)

    axe2 = plt.subplot(1, 3, 2)
    axe2.scatter(type1[0], type1[2])
    axe2.scatter(type2[0], type2[2])
    axe2.scatter(type3[0], type3[2])
    plt.legend(labels)

    axe3 = plt.subplot(1, 3, 3)
    axe3.scatter(type1[1], type1[2])
    axe3.scatter(type2[1], type2[2])
    axe3.scatter(type3[2], type3[2])
    plt.legend(labels)
    plt.show()

def split_dataset(dataset, class_vec):
    ratio = 0.8
    stop_index = int(dataset.shape[0] * ratio)
    train_dataset = dataset[: stop_index, :]
    test_dataset = dataset[stop_index:, :]

    train_class = class_vec[: stop_index]
    test_class = class_vec[stop_index :]

    return train_dataset, test_dataset, train_class, test_class

def data_normalize(train_dataset):
    maxv = train_dataset.max(0)
    minv = train_dataset.min(0)
    diff = maxv -minv
    # print(diff, type(diff))
    data_normal = (train_dataset -  np.tile(minv, (train_dataset.shape[0],1))) / np.tile(diff, (train_dataset.shape[0],1))
    # print(data_normal[:10,:])
    return data_normal, maxv, minv

def KNN(train_dataset, train_class, input_data, k):
    difference = np.sum((train_dataset - input_data) ** 2, 1)
    sorted_index = difference.argsort()
    class_count = {}
    for i in range(k):
        voted_label = train_class[sorted_index[i]]
        class_count[voted_label] = class_count.get(voted_label, 0) + 1

    sorted_class = sorted(class_count.items(), key = operator.itemgetter(1), reverse=True)
    return sorted_class[0][0]

def main():
    file_path = "datingTestSet.txt"
    dataset, class_vec = read_data(file_path)
    print('dataset = \n', dataset[:5, :])
    print(type(class_vec), 'class_vec = \n', class_vec[:20])

    view_data(dataset, class_vec)
    print('画图完成!')

    train_dataset, test_dataset, train_class, test_class = split_dataset(dataset, class_vec)
    train_data_normal, maxv, minv = data_normalize(train_dataset)
    error_num = 0
    for i in range(len(test_dataset)):
        data = test_dataset[i]
        data_normal = (data - minv) / (maxv - minv)
        label = KNN(train_data_normal, train_class, data_normal, 3)
        print('估计出的标签为%s, 实际的标签为:%s' % (label, test_class[i]))
        if str(label) != str(test_class[i]):
            error_num += 1
            print('*' * 20, '上面一行错误', '*' * 20)
    print('错误率:%.2f' % (float(error_num / len(test_dataset))))

if __name__ == "__main__":
    main()

运行结果

### 回答1: B'educoder机器学习KNN算法'是指在机器学习中,使用KNN(K-最近邻)算法进行数据分类或回归的过程。它通过计算每个样本点与其最近的k个邻居之间的距离来分类或回归。该算法常用于给定一些已经被分类或回归的数据,以对新的、未知的数据进行分类或回归。 ### 回答2: KNN算法是机器学习中最常见的分类算法之一,属于无参数的非线性算法,也是解决分类问题的一种最简单有效的算法之一。KNN全称为K-Nearest Neighbor算法,它的主要思想是如果一个样本在特征空间中的k个最相似(即特征空间中最近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法的主要流程是先将数据集中所有实例按照特征向量之间的距离从小到大进行排序,然后选取相邻的K个样本,根据它们属于的类别计算出该样本的类别,即选取K个样本中出现最多的类别作为该样本的预测类别。通常情况下,K的选择是非常重要的,如果K太小会使得预测错误率变高,而K太大会使得不同的样本预测出的类别相同,从而无法实现分类。 KNN算法的应用非常广泛,包括文本分类、图像识别、推荐系统等领域。由于该算法的思路简单易懂且计算量相对较小,因此它在大数据时代依然被广泛应用。同时,在KNN算法的基础上也有很多改进算法被提出,如KD树、球树等,它们可以有效地提高KNN算法的运行效率和准确率。 在educoder机器学习的学习中,我们可以利用Python语言的scikit-learn库实现KNN算法。该库提供了KNeighborsClassifier类,它可以根据给定的数据集和K值训练KNN分类器,并用来预测新的样本。在使用scikit-learn库进行分类问题解决时,通常需要将数据进行归一化处理,以避免特征之间的差异对结果的影响。同时,还需要采用交叉验证等方法优化模型的参数和选择最优的K值,从而提高KNN算法的准确率和泛化能力。 总的来说,KNN算法是机器学习中一种简单有效的分类算法,它的应用非常广泛。在educoder机器学习的学习中,我们可以通过掌握KNN算法的基本原理和应用方法,来更好地应用这种算法解决实际的分类问题。 ### 回答3: KNN(K-Nearest Neighbor)算法是一种基本的分类和回归算法,经常被用于机器学习中。其基本思想是预测未知的样本所属类别或预测目标值,通过已知的样本集来找到与未知样本最近的K个样本(即K个最近邻)来进行预测。KNN算法的核心是距离度量和K值的选择。 在KNN算法的训练过程中,首先需要将所有样本的特征向量保存在内存里。对于一个未知的样本,计算其与内存中所有样本的距离,并选出离该样本最近的K个样本。可以使用欧式距离或曼哈顿距离来度量距离。在分类问题中,K个邻居样本中占比最大的那个类别即为预测结果;在回归问题中,K个邻居的目标值的平均值或加权平均值即为预测结果。 KNN算法的优点是简单有效,不需要训练过程,可以自适应地进行分类或回归。但也存在缺点,如不善处理多分类问题和高维数据,受样本分布的影响较大等。在实际应用中,可以采用交叉验证和特征选择等手段来解决一些问题。 在educoder机器学习KNN算法教学中,可以学习到该算法的具体实现和应用,如如何选择距离度量、K值的选择和分类与回归问题的应用。同时也可以通过练习和作业来加深对算法的理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值