python 实现K近邻算法并进行可视化 调用sklearn的knn算法进行结果对比

 

  • K近邻算法 思想:不知其人视其友

  • K近邻算法(knn)实现步骤:
  1.     计算当前点与已知类别数据集中的点的距离
  2.     距离递增排序,选出距离最小的k个点
  3.     确定前k个点类别出现的频率
  4.     将频率最高的类别作为当前点的预测分类

  • 完整代码实现
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @author: T


# 导入数据集
from sklearn.datasets import make_blobs
# 导入sklearn knn算法
from sklearn.neighbors import KNeighborsClassifier
# 导入数值计算库
import numpy as np 
# 导入画图库
import matplotlib.pyplot as plt
# 指定默认字体 解决画图中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['axes.unicode_minus'] = False

'''
K近邻算法 思想:不知其人视其友
'''
'''
K近邻算法(knn)实现步骤:
	1.计算当前点与已知类别数据集中的点的距离
	2.距离递增排序,选出距离最小的k个点
	3.确定前k个点类别出现的频率
	4.将频率最高的类别最为当前点的预测分类
'''

def knn(inX, dataSet
  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面给您提供一个 Python 实现的 k-近邻算法示例: 首先,我们需要导入必要的库:numpy 用于矩阵计算和 matplotlib 用于可视化。 ```python import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们定义一个函数用于计算测试数据点与训练数据集中各个数据点的欧式距离。 ```python def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2)**2)) ``` 然后,我们定义一个 KNN 类,其中包含一个 fit 方法和一个 predict 方法。fit 方法用于训练模型,predict 方法用于预测测试数据点的标签。 ```python class KNN: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y def predict(self, X): predicted_labels = [self._predict(x) for x in X] return np.array(predicted_labels) def _predict(self, x): distances = [euclidean_distance(x, x_train) for x_train in self.X_train] k_indices = np.argsort(distances)[:self.k] k_nearest_labels = [self.y_train[i] for i in k_indices] most_common = Counter(k_nearest_labels).most_common(1) return most_common[0][0] ``` 在 predict 方法中,我们首先通过调用 _predict 方法来获得测试数据点的预测标签。在 _predict 方法中,我们计算测试数据点与训练数据集中各个数据点的距离,然后选择距离最近的 k 个数据点,获取它们的标签,并通过 Counter 类统计出现次数最多的标签,作为测试数据点的预测标签。 最后,我们使用 iris 数据集来测试我们的 KNN 算法。iris 数据集是一个经典的分类数据集,包含 3 种不同种类的鸢尾花,每个种类有 50 个样本,每个样本有 4 个特征。我们只使用其中的前两个特征和前 100 个样本来进行测试。 ```python from sklearn.datasets import load_iris from collections import Counter iris = load_iris() X = iris.data[:, :2] y = iris.target[:100] knn = KNN(k=3) knn.fit(X, y) # 绘制决策边界 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, 0.1), np.arange(y_min, y_max, 0.1)) Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.5) plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.show() ``` 运行上述代码,我们可以得到如下的决策边界图像: ![knn](https://img-blog.csdnimg.cn/20210611094912330.png) 在图像中,蓝色点表示第一类鸢尾花,红色点表示第二类鸢尾花。我们可以看到,KNN 算法成功将两种不同类别的鸢尾花分割开来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值