一、k-近邻算法
1.1 k-近邻算法介绍
k-近邻(k-nearest neighbors, k-NN)算法是一种常见的机器学习方法,主要用于分类和回归问题。该算法基于一个简单的思想:如果一个样本在特征空间中的k个最近邻居中的大多数属于某个类别,则该样本也属于这个类别。
在k-近邻算法中,通过比较不同样本之间的特征相似度,确定新样本的类别或者数值标签。k-NN的工作原理很直观,通过测量不同样本之间的距离(如欧氏距离),找到离目标样本最近的k个邻居,然后利用它们的类别标签(对于分类问题)或数值标签的平均值(对于回归问题)来预测目标样本的类别或值。
这个算法非常易于理解,不需要进行模型训练,但是在大规模数据集上的计算成本较高。
1.2 k-近邻算法的基本流程
1. 准备数据:收集样本数据,并且对每个样本进行标记(分类问题)或者赋予数值标签(回归问题)。
2. 确定k值:选择合适的k值,即要考虑的最近邻居的数量。
3. 计算距离:对于新的样本数据,计算它与训练集中所有样本的距离,通常使用欧氏距离或其他距离度量来衡量样本之间的相似度。
4. 找到k个最近邻:选择与新样本距离最近的k个样本。
5. 进行预测:
分类问题:对于分类问题,统计这k个样本中各个类别的频数,将新样本分配给频数最高的类别。
回归问题:对于回归问题,计算这k个样本的平均数值,并将该平均值作为新样本的预测结果。
6. 输出结果:得到新样本的分类或数值标签作为预测结果。
二、利用k近邻算法实现水果分类
2.1实验目的
本次实验旨在通过k近邻算法对苹果和香蕉进行分类,通过提取这两种水果的两种特征:直径和高度,来进行分类。
2.2数据准备
# 随机生成苹果和香蕉的样本数据
apple_data = np.random.rand(10, 2) * [2 + 1, 2] + [5, 8]
banana_data = np.random.rand(10, 2) * [2, 2] + [3, 7]
# 组合所有数据
all_data = np.vstack([apple_data, banana_data])
labels = np.array([0] * 10 + [1] * 10) # 0表示苹果,1表示香蕉
这里生成了10个苹果的数据,直径在5-7cm之间,高度在8-10cm之间,10个香蕉的数据,直径在3-5cm之间,高度在7-9cm之间。
2.3数据处理
可以使用 scikit-learn 库中的 MinMaxScaler
来进行数据归一化处理
# 数据归一化处理
scaler = MinMaxScaler()
all_data_normalized = scaler.fit_transform(all_data)
2.4代码实现
import numpy as np
import matplotlib.pyplot as plt
import operator
from sklearn.preprocessing import MinMaxScaler
def knn(test_data, all_data, data_labels, k):
data_size = all_data.shape[0]
# 计算距离
delta_data = np.tile(test_data, (data_size, 1)) - all_data
distances = (delta_data ** 2).sum(axis=1) ** 0.5
# 排序
sorted_indices = distances.argsort()
class_count = {}
# 找到与待测数据最近的前k个数据
for i in range(k):
label = data_labels[sorted_indices[i]]
class_count[label] = class_count.get(label, 0) + 1
sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
return sorted_class_count[0][0]
# 随机生成苹果和香蕉的样本数据
apple_data = np.random.rand(10, 2) * [2 + 1, 2] + [5, 8]
banana_data = np.random.rand(10, 2) * [2, 2] + [3, 7]
# 组合所有数据
all_data = np.vstack([apple_data, banana_data])
labels = np.array([0] * 10 + [1] * 10) # 0表示苹果,1表示香蕉
# 数据归一化处理
scaler = MinMaxScaler()
all_data_normalized = scaler.fit_transform(all_data)
# 生成一个随机测试数据,并进行归一化
test_data = np.random.rand(1, 2) * [3, 3] + [2, 2]
test_data_normalized = scaler.transform(test_data)
# 调用knn函数进行预测
result = knn(test_data_normalized, all_data_normalized, labels, 3)
print("预测结果:", "苹果" if result == 0 else "香蕉")
三、总结
在本次学习过程中,我们通过Python示例实现了K-近邻算法。首先,我们随机生成了苹果和香蕉的样本数据,并使用KNN算法来对新样本进行分类。在示例代码中,我们还加入了数据归一化的功能,以确保不同特征有相同的重要性。