机器学习-KNN算法

 

KNN(K-Nearest Neighbors Algorithm)

1.工作原理
存在一个样本数据集合,也称作训练样本集,并且样本

集中每个数据都存在标签,即我们知道样本集中每个数 据与所属分类的对应关系。

输入没有标签的新数据后,将新数据的每个特征与样本 集中数据对应的特征进行比较,然后算法提取样本集中 特征最相似数据(最近邻)的分类标签。

一般来说,只选择样本数据集中前N个最相似的数据。K 一般不大于20,最后,选择k个中出现次数最多的分类,

作为新数据的分类

2.算法流程

 

收集数据:可以使用任何方法

准备数据:距离计算所需要的数值,最后是结构化的数 据格式。

分析数据:可以使用任何方法

训练算法: (此步骤kNN)中不适用

测试算法:计算错误率

使用算法:首先需要输入样本数据和结构化的输出结果,

然后运行k-近邻算法判定输入数据分别属于哪个分类, 最后应用对计算出的分类执行后续的处理。

3.K值的选择

如果选择较小的K值 :a.“学 习”的近似误差(approximation error)会减小,但 “学习”的估计误差(estimation error) 会增大,
b.噪声敏感,c.K值的减小就意味着整体模型变得复杂,容易发生过 拟 合.

如果选择较大的K值:a.减少学习的估计误差,但缺点是学习的近似误差会增大.同时K值的增大 就意味着整体的模型变得简单.

 

4.代码实现

(1) iris 数据集分类效果进行预测,使用代码中的2维数据进行可视化,使用sklearn

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors
import pandas as pd

n_neighbors = 15

# import some data to play with
path = './iris.data'
iris = np.array(pd.read_csv(path, header=None))

# we only take the first two features. We could avoid this ugly
# slicing by using a two-dim dataset
X = iris[:, :2]
y = pd.Categorical(iris[:,4]).codes

h = .02  # step size in the mesh

# Create color maps
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

for weights in ['uniform', 'distance']:
    # we create an instance of Neighbours Classifier and fit the data.
    clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
    clf.fit(X, y)

    # Plot the decision boundary. For that, we will assign a color to each
    # point in the mesh [x_min, x_max]x[y_min, y_max].
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    # Put the result into a color plot
    Z = Z.reshape(xx.shape)
    plt.figure()
    plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

    # Plot also the training points
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold,
                edgecolor='k', s=20)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.title("3-Class classification (k = %i, weights = '%s')"
              % (n_neighbors, weights))
plt.show()

(2)knn算法的Python实现,使用的欧氏距离

import numpy as np
import operator

# Python实现
# inx 测试样本
# dataSet,labels训练样本及其标签
# k最近近邻范围
 

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

 

### 关于头歌平台中KNN算法机器学习教程与实例 #### 头歌平台概述 头歌(Tougo)是一个专注于计算机科学教育的学习平台,提供丰富的在线课程资源和实践环境。对于机器学习领域的内容,尤其是像KNN这样经典的算法,通常会通过理论讲解、代码实现以及实际应用案例相结合的方式进行教学。 #### KNN算法简介 KNN(K-Nearest Neighbors)是一种基于实例的学习方法,既可用于分类也可用于回归分析。其核心思想是:给定一个测试样本,在训练集中找到与其最近的K个邻居,并依据这K个邻居的信息来进行决策[^2]。 #### KNN算法的主要步骤 1. 数据预处理阶段,包括标准化或归一化操作以消除不同特征间量纲差异的影响。 2. 计算待测样本到所有已知样本的距离,常用欧氏距离或其他形式的距离度量方式。 3. 找出距离最小的前K个样本作为近邻点集合。 4. 对于分类任务采用投票机制决定最终类别;而对于回归任务则取平均值或者加权平均值得出结果。 #### 距离计算公式示例 以下是两种常见距离公式的Python实现: ```python import numpy as np def euclidean_distance(x, y): """欧几里得距离""" return np.sqrt(np.sum((np.array(x) - np.array(y)) ** 2)) def manhattan_distance(x, y): """曼哈顿距离""" return np.sum(abs(np.array(x) - np.array(y))) ``` 上述函数分别实现了欧氏距离和曼哈顿距离的计算过程。 #### 实际应用场景举例 假设我们有一个简单的电影分类场景,其中每部影片由两个属性描述:“拥抱次数”和“打斗次数”。利用已有标注的数据集可以构建模型并预测未知标签的新样例所属类型[^4]。 #### 可能存在的挑战及优化方向 尽管KNN易于理解和实现,但在大规模数据集上的性能可能较差,因为每次都需要遍历整个数据库寻找最接近的邻居。因此可以通过KD树索引结构加速查询效率,或是引入降维技术减少维度灾难带来的影响[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值