KNN算法

本文介绍了距离度量在数学和统计中的概念,重点讲解了欧氏距离、曼哈顿距离、闵可夫斯基距离和切比雪夫距离。同时阐述了特征预处理,特别是归一化在KNN算法中的重要性,以鸢尾花分类为例展示了数据划分、预处理和模型评估的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:距离度量

距离度量是指在数学和统计学中用来衡量两个对象之间的相似性或差异性的方法。常见的距离度量包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。这些距离度量方法可以帮助我们计算出两个对象之间的距离,从而进行相似性分析、聚类分析、分类分析等。在机器学习和数据挖掘领域,距离度量是非常重要的工具,常常用来评估数据之间的相似性或差异性,从而进行模式识别和预测分析。

2:距离度量方法

常见的距离度量方法包括:

  1. 欧氏距离(Euclidean Distance):欧氏距离是最常见的距离度量方法,计算两个点之间的直线距离。在二维空间中,欧氏距离可以表示为(X1−X2)**2+(y1−y2)**2 再开根号 

  2. 曼哈顿距离(Manhattan Distance):曼哈顿距离是计算两个点在各个坐标轴上的距离总和。在二维空间中,曼哈顿距离可以表示为∣x1​−x2​∣+∣y1​−y2​∣

  3. 闵可夫斯基距离(Minkowski Distance):闵可夫斯基距离是欧氏距离和曼哈顿距离的一般化形式,可以根据参数p的不同取值,分别表示为欧氏距离和曼哈顿距离。在二维空间中,闵可夫斯基距离可以表示为:(∑i=1n​∣x1i​−x2i​∣p)p1​

  4. 切比雪夫距离(Chebyshev Distance):切比雪夫距离是计算两个点在各个坐标轴上的最大距离。在二维空间中,切比雪夫距离可以表示为:max(∣x1​−x2​∣,∣y1​−y2​∣)

3:特征预处理

特征预处理是指在机器学习和数据挖掘任务中对原始数据进行处理和转换,以便更好地适应模型的需求。特征预处理包括数据清洗、特征选择、特征变换等步骤,旨在提高数据的质量和模型的性能。

4:归一化

在使用K最近邻(KNN)算法进行数据建模时,对数据进行归一化是一种常见的特征预处理方法。归一化可以将数据缩放到相同的尺度,避免不同特征之间的数值差异对距离计算产生影响,从而提高模型的性能。

常见的归一化方法包括:

  1. 最小-最大归一化(Min-Max Normalization):将数据缩放到一个固定的范围,通常是[0, 1]或[-1, 1]。归一化公式为: Xnorm​=Xmax​−Xmin​X−Xmin​​

  2. Z-score标准化(Standardization):将数据转换为均值为0,标准差为1的正态分布。标准化公式为: Xstd​=σX−μ​ 其中,μ为数据的均值,σ为数据的标准差。

在使用KNN算法时,通常推荐对数据进行归一化处理,特别是当特征之间的尺度差异较大时。因为KNN算法是基于距离度量进行分类或回归的,如果不对数据进行归一化,那些数值范围较大的特征将会对距离计算产生更大的影响,从而影响模型的准确性。

from sklearn.preprocessing import MinMaxScalerdef dm01_MinMaxScaler():

# 1.准备数据 data = [[56, 2, 90, 40],[77, 49, 10, 45],[5, 3, 3, 6]]

# 2.初始化归一化对象transformer = MinMaxScaler()

# 3.对原始特征进行变换data = transformer.fit_transform(data)

# 4.打印归一化后的结果print(data)

在实际应用中,可以根据数据的具体情况和模型的需求选择合适的归一化方法。通常建议对数据进行归一化处理后再使用KNN算法进行建模,以获得更好的效果。

5: 标准化

标准化是一种常见的数据预处理方法,用于将数据转换为均值为0,标准差为1的正态分布。标准化可以消除数据的量纲影响,使得不同变量之间具有可比性,有利于某些机器学习算法的训练和收敛。

标准化的公式为: Xstd​=σX−μ​ 其中,X 是原始数据,stdXstd​ 是标准化后的数据,μ 是原始数据的均值,σ 是原始数据的标准差。

from sklearn.preprocessingimport StandardScalerdef dm03_StandardScaler():#对特征值进行标准化

# 1.准备数据准备数据 data = [[56, 2, 90, 40],[77, 49, 10, 45],[5, 3, 3, 6]]

# 2.初始化标准化对象transformer = StandardScaler()

# 3.对原始特征进行变换data = transformer.fit_transform(data)

# 4.打印归一化后的结果print(data)

# 5打印每1列数据的均值和标准差print('transfer.mean_-->', transfer.mean_)print('transfer.var_-->', transfer.var_

标准化的步骤如下:

  1. 计算每个特征的均值 μ 和标准差 σ。
  2. 对每个特征的每个值进行标准化处理,使用上述公式计算标准化后的值。

标准化的优点包括:

  1. 消除量纲影响:不同特征的量纲不同会影响到机器学习模型的训练和结果,标准化可以解决这个问题。
  2. 提高模型性能:某些机器学习算法对数据的分布有要求,标准化可以使数据更符合这些算法的假设。
  3. 加速收敛:标准化后的数据可以加快模型的收敛速度,提高训练效率。

鸢尾花分类

1;收集数据

from sklearn.datasetsimport load_iris

#加载鸢尾花数据集,并显属性def dm01_loadiris():

#加载数据集mydataset= load_iris()

#查看数据集信息print('\n查看数据集信息-->\n', mydataset.data[:5])

#查看目标值print('mydataset.target-->\n', mydataset.target)

#查看目标值名字print('mydataset.target_names-->\n', mydataset.target_names)

#查看特征名print('mydataset.feature_names-->\n', mydataset.feature_names)

2:加载数据

def dm02_showiris():

# 1载入鸢尾花数据集并显示特征名称.feature_namesmydataset= load_iris()print(mydataset.feature_names)

# 2把数据转换成dataframe格式设置data, columns属性目标值名称iris_d= pd.DataFrame(mydataset['data'], columns=mydataset.feature_names)iris_d['Species'] = mydataset.targetprint('\niris_d-->\n', iris_d)col1 = 'sepal length (cm)'col2 = 'petal width (cm)'

# 3 sns.lmplot()显示sns.lmplot(x=col1, y=col2, data=iris_d, hue='Species', fit_reg=False)

3:数据划分

def dm03_traintest_split():

# 1加载数据集mydataset= load_iris()

# 2划分数据集X_train, X_test, y_train, y_test=train_test_split(mydataset.data, mydataset.target,test_size=0.3, random_state=22)print('数据总数量', len(mydataset.data))

4:模型训练

def dm04:

# 1获取数据集mydataset= load_iris()

# 2数据基本处理x_train, x_test, y_train, y_test= train_test_split(mydataset.data, mydataset.target, test_size=0.2,random_state=22)

# 3数据集预处理-数据标准化transfer = StandardScaler()x_train= transfer.fit_transform(x_train)#让测试集的均值和方法,转换测试集数据;x_test= transfer.transform(x_test)

# 4机器学习(模型训练)estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train, y_train)

# 5模型评估直接计算准确率100个样本中模型预测对了多少myscore= estimator.score(x_test, y_test)print(‘myscore-->’, myscore

5:模型评估

# 1获取数据集mydataset= load_iris()

# 2数据基本处理x_train, x_test, y_train, y_test= train_test_split(mydataset.data, mydataset.target,test_size=0.2, random_state=22)

# 3数据集预处理-数据标准化transfer = StandardScaler()x_train= transfer.fit_transform(x_train)#让测试集的均值和方法,转换测试集数据;x_test= transfer.transform(x_test)

# 4机器学习(模型训练)estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train, y_train)

# 5-1直接使用score函数模型评估100个样本中模型预测对了多少myscore= estimator.score(x_test, y_test)print('myscore-->', myscore)# 5-2利用sklearn.metrics包中的accuracy_score方法y_predict= estimator.predict(x_test)myresult= accuracy_score(y_test, y_predict)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值