上文接大数据作业
k邻近算法(k-Nearest Neighbors, k-NN)是一种用于分类和回归的非参数监督学习算法。它的基本思想是:给定一个样本数据集,其中每个数据都有一个标签,当输入新的实例时,该算法会在训练数据集中找到与该实例最接近的k个实例,并根据这k个邻居的信息来预测新实例的标签。
主要步骤:
-
选择参数k:k是一个用户指定的常数,表示在决策过程中会考虑多少个邻居。
-
计算距离:对于待分类的实例,计算它与训练集中每个实例之间的距离。常用的距离度量方法包括欧氏距离、曼哈顿距离等。
-
选择k个最近邻:根据计算出的距离,选择距离最近的k个实例。
-
投票或平均:
- 分类问题:这k个实例的标签中占多数的标签即为新实例的预测标签。
- 回归问题:取这k个实例标签的平均值作为新实例的预测值。
特点:
- 简单易懂:k-NN算法直观且易于实现。
- 无需训练:由于k-NN在预测时才进行计算,理论上不需要显式的训练过程。
- 适合小数据集:在小数据集上通常表现良好,但在大数据集上计算成本较高。
缺点:
- 计算复杂度高:随着数据量的增加,计算距离的成本会显著增加。
- 高内存需求:需要存储所有的训练数据。
- 对特征缩放敏感:不同量纲的特征可能会影响距离计算,因此通常需要进行数据标准化。
k-NN是一种基础且实用的算法,常用于需要快速实现的任务或作为复杂模型的基线。
常见问题:
距离怎么算?
第一范式距离(哈密顿距离):井字路距离
第二范式距离(欧氏距离):
无穷范式距离(切比雪夫距离):国际象棋国王
缺点:
没有考虑不同维度的单位
没有考虑不同维度的分布
k应该怎么选?
! 为什么k不能无脑选1?
选择k=1在k邻近算法中有其特定的风险和局限性,主要原因如下:
-
对噪声敏感:当k=1时,算法仅依赖于离目标实例最近的一个训练样本进行预测。如果该最近的样本是噪声数据或异常值,预测结果可能会受到严重影响。这会导致模型对训练数据中的噪声特别敏感,从而降低泛化能力。
-
过拟合风险:k=1可能导致模型过拟合于训练数据,因为它严格按照训练数据中的最近邻居进行分类或回归。这意味着模型在训练数据上表现很好,但在处理新的、未见过的数据时可能会表现不佳。
-
决策边界不稳定:当k=1时,决策边界会变得非常不稳定,可能会非常复杂且不平滑。这是因为每个训练样本都会有自己的影响范围,导致决策边界紧随训练数据的分布变化。
选择合适的k值通常需要通过交叉验证等方法进行调整,以在模型的复杂度和泛化能力之间取得平衡。通常建议选择一个较小但大于1的k值,以减少对单个点的敏感性,同时保持模型的灵活性。
k选大了会怎么样?
如果在k邻近算法(k-NN)中选择的k值过大,会带来一些潜在的问题,具体如下:
-
模型过于平滑:当k值过大时,模型会考虑更多的邻居来进行预测,这可能导致模型过于平滑,从而忽略了数据中的局部结构和细节。这会使模型无法捕捉到数据中的复杂模式,导致欠拟合。
-
计算复杂度增加:虽然k值的增加不会显著增加单次预测的计算复杂度,但由于需要考虑更多的邻居,整体预测时间可能会增加。
-
类别不平衡问题!:在分类问题中,如果某个类别在数据集中占据主导地位,选择较大的k值会使得该类别在多数投票中更容易占据主导地位,从而导致模型偏向于这种主导类别,忽略了少数类别的数据点。
-
降低模型的准确性:当k值过大时,预测结果会受到较远邻居的影响,这些远邻居可能与待分类点的相似性较低,从而降低预测的准确性。
选择适当的k值
为了选择适当的k值,通常可以采用以下几种方法:
-
交叉验证:通过交叉验证来评估不同k值的表现,从而选择一个能够在验证集上取得最佳表现的k值。
-
经验法则:一些经验法则建议k值一般选择为数据集大小的平方根,或者在小范围内进行调参(例如1到20之间)。
-
网格搜索:在一个预定义的k值范围内进行网格搜索,评估每个k值的表现,从而找到最优的k值。
总之,选择合适的k值是k-NN算法应用中的一个关键步骤,需要在模型复杂度和泛化能力之间找到平衡点。
思考
在实际生活中该算法其实可以表现得很好,很符合社会规律,物以类聚,人以群分。
我认为矛盾主要在于样本点,样本点维度太少,有些特性没有表现出来,体现出一些不确定性。样本点多了,计算量又增长的太快,实在是矛盾。