python实现带权KNN算法并可视化展示

这篇博客介绍了如何在Python中实现带权的KNN算法,权重为距离的倒数。作者使用鸢尾花数据集进行训练和测试,K值设为3。通过数据预处理、模型训练和预测,展示了KNN算法在分类问题中的应用,并给出了预测准确率。最后,博客还通过可视化展示了正确和错误分类的测试样本。
摘要由CSDN通过智能技术生成

常见的KNN算法并不带权,或者说是所有的数据的权值都是1,而在这里实现的是带权的KNN算法,权值为距离的倒数,K值为3,代码如下

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import numpy as np

# 读取鸢尾花数据集,header参数来指定标题的行,默认是0,如果没有标题,参数设置为None
data = pd.read_csv(r"C:\\Users\\不归客\Desktop\\iris.csv", header=0)

# 随机抽取一定的数据,默认为1行
# print(data.sample())

# 数据清洗,将Species列转为数值类型
data["Species"] = data["Species"].map(
    {"versicolor": 0, "setosa": 1, "virginica": 2})
# 删除不需要的Id列,默认是删除行,axis=1是指删除列
# drop是删除副本中的数据,inplace=True是指用副本替换掉原本
data.drop("Id", axis=1, inplace=True)
# 判断数据集中是否有重复项,只要有重复项,结果就为True
# data.duplicated().any()
if data.duplicated().any():
    # 删除重复项
    data.drop_duplicates(inplace=True)

# 查看每个类别的鸢尾花有多少条数据
print(data["Species"].value_counts())


class KNN:
    def __init__(self, k):
        '''初始化方法

        Parameters
        --------
        K:邻居的个数
        '''
        self.k = k

    def fit(self, X, y):
        '''训练方法

        Parameters
        --------
        X:类数组类型,形状为[样本数量,特征数量] [149,4]
          待训练的样本特征(属性)
        y:类数组类型,形状为[样本数量]
          每个样本的目标值(标签)
        '''
        # 将X转换为ndarray数组类型
        self.X = np.asarray(X)
        self.y = np.asarray(y)

    def predict(self, X):
        '''根据参数传递的样本,进而对样本数据进行预测(考虑权重,距离越远权重越小,使用距离的倒数作为权重)

        Parameters
        --------
        X:类数组类型,形状为[样本数量,特征数量] [149,4]
          待训练的样本特征(属性)

        Returns
        -------
        result:数组类型
            预测的结果
        '''
        X = np.asarray(X)
        result = []
        # 对ndarray数组进行遍历,每次取数组中的一行
        for x in X:
            # sum默认是将所有的数值求和,axis=1是按行求和
            dis = np.sqrt(np.sum(((x - self.X) ** 2), axis=1))
            # 返回数组排序后每个数组在原数组中的索引
            index = dis.argsort()
            # 进行截断,只取前k个元素
            index = index[:self.k]
            # bincount返回每个元素出现的次数,元素必须是非负的整数[使用weights考虑权重,权重为距离的倒数]
            count = np.bincount(self.y[index], weights=1/dis[index])
            # 返回ndarray数组中,值最大的元素对应的索引,该索引就是我们判定的类别
            # 最大元素,就是出现次数最多的元素
            result.append(count.argmax())
        return np.asarray(result)


# 将数据集随机打乱
t0 = data[data["Species"] == 0]
t1 = data[data["Species"] == 1]
t2 = data[data["Species"] == 2]
# 对每个类别数据进行洗牌
t0 = t0.sample(len(t0), random_state=0)
t1 = t1.sample(len(t1), random_state=0)
t2 = t2.sample(len(t2), random_state=0)
# 构建训练集与测试集
train_X = pd.concat(
    [t0.iloc[:40, :-1], t1.iloc[:40, :-1], t2.iloc[:40, :-1]], axis=0)
train_y = pd.concat(
    [t0.iloc[:40, -1], t1.iloc[:40, -1], t2.iloc[:40, -1]], axis=0)
test_X = pd.concat(
    [t0.iloc[40:, :-1], t1.iloc[40:, :-1], t2.iloc[40:, :-1]], axis=0)
test_y = pd.concat(
    [t0.iloc[40:, -1], t1.iloc[40:, -1], t2.iloc[40:, -1]], axis=0)

# 创建KNN对象,进行训练与测试
knn = KNN(k=3)
# 进行训练
knn.fit(train_X, train_y)
# 进行测试,获得测试结果
result = knn.predict(test_X)
print("预测正确的个数:", np.sum(result == test_y), "测试集的总数:", len(
    test_y), "预测准确率:", np.sum(result == test_y)/len(test_y))


'''
将预测结果可视化展示
'''
# 设置画布大小
plt.figure(figsize=(10, 10))
# 设置参数,保证可以中文显示
mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
# 训练集数据,绘制散点图,选择其中两个属性进行绘制
plt.scatter(x=t0["Sepal.Length"][:40], y=t0["Petal.Length"]
            [:40], color="r", label='virginica')
plt.scatter(x=t1["Sepal.Length"][:40], y=t1["Petal.Length"]
            [:40], color="green", label='setosa')
plt.scatter(x=t2["Sepal.Length"][:40], y=t2["Petal.Length"]
            [:40], color="b", label='versicolor')
# 绘制测试集数据
right = test_X[result == test_y]
wrong = test_X[result != test_y]
plt.scatter(x=right["Sepal.Length"], y=right["Petal.Length"],
            color='c', marker="x", label='right')
plt.scatter(x=wrong["Sepal.Length"], y=wrong["Petal.Length"],
            color='m', marker=">", label='wrong')
plt.xlabel("花萼长度")
plt.ylabel("花瓣长度")
plt.title("KNN分类结果显示")
plt.legend()
plt.show()

数据集在百度网盘,链接如下
链接:https://pan.baidu.com/s/1gOTQ1KoKbFUmDNQYA_0nWg
提取码:soft

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为你介绍一些Python可视化KNN算法结果的方法。 首先,你需要安装一些Python可视化库,比如Matplotlib和Seaborn。然后,你可以使用Scikit-learn库中的KNeighborsClassifier类来实现KNN算法。 以下是一个简单的示例代码,可以用于可视化KNN算法结果: ```python import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split # 加载鸢尾花数据集 iris = load_iris() # 将数据集分成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2) # 拟合KNN模型 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) # 预测测试集 y_pred = knn.predict(X_test) # 绘制散点图 sns.scatterplot(x=X_test[:, 0], y=X_test[:, 1], hue=y_pred, palette='dark') # 设置图形标题和坐标轴标签 plt.title('KNN Classification') plt.xlabel('Feature 1') plt.ylabel('Feature 2') # 显示图形 plt.show() ``` 这个例子使用鸢尾花数据集来展示KNN算法的分类结果。首先,它将数据集分成训练集和测试集。然后,它拟合一个KNN模型,并使用训练好的模型来预测测试集结果。最后,它使用Matplotlib和Seaborn库来绘制散点图,其中不同类别的点使用不同的颜色表示。 你可以根据你的数据集和需求进行修改和调整。希望这可以帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单手提煤气罐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值