K-近邻分类算法的python实现-鸢尾花数据集

import numpy as np
import operator as opt
import matplotlib.pyplot as plt
import collections as clt
from sklearn import datasets

# K-近邻算法 鸢尾花数据测试

# KNN分类算法
# 算法描述:
# 1.参数说明:待分类向量x、训练数据集(特征向量组)A、标签向量、参数(k)
# 2.计算x与A中所有向量的距离,并返回排序索引数组
# 3.标签向量使用2中的索引数组,取出前k个标签名,出现次数最多的就是x的标签


def KNN(x, dataSet, lable, k):
    
    assert 1 <= k <= dataSet.shape[0] ," k must be valid "
    assert dataSet.shape[0]==lable.shape[0],"数据集和标签集不对等"
    assert x.shape[0] == dataSet.shape[1],"待测数据与数据集特征数不相等"

    # 计算距离
    # 计算测试数据集rows(数据量)
    dataSetSize = dataSet.shape[0]
    # 将x扩展为dataSet同大小的矩阵,
    # 使用numpy中的universal function对矩阵元素分别进行计算的原则,避免使用循环
    X = np.tile(x, (dataSetSize, 1))  # 复制dataSetSize-1个x向量
    # 计算距离
    distances = (((X-dataSet)**2).sum(axis=1))**0.5
    # 根据距离进行排序,并返回索引数组
    index_SortByDistance = distances.argsort()
    # 获取距离最近的三个标签
    hyperLables = []
    for i in range(k):
        hyperLables.append(lable[index_SortByDistance[i]])
    # 获取出现次数最多的标签
    return clt.Counter(hyperLables).most_common(1)[0][0]


# 获取鸢尾花数据集
iris = datasets.load_iris()
# 训练数据:每种花选取25个数据,注意标签要和数据一一对应
datasets = np.vstack(
    (iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack(
    (iris.target[0:25], iris.target[50:75], iris.target[100:125]))

# 遍历剩下的待分类数据

a = [i for i in range(150) if ((i >= 25) and (i < 50)) or (
    (i >= 75) and (i < 100)) or ((i >= 125) and (i < 150))]
success_num = 0
fail_num = 0
for i in a:
    x = iris.data[i, ...]
    xtarget = KNN(x, datasets, lable, 1)
    if(iris.target_names[xtarget] == iris.target_names[iris.target[i]]):
        # print("分类成功")
        success_num += 1
    else:
        # print("分类失败")
        fail_num += 1

print("分类完成:成功({});失败({})".format(success_num, fail_num))

使用sklearn封装好的KNN算法

import numpy as np 
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn import datasets

# 获取鸢尾花数据集
iris = datasets.load_iris()
# 训练数据:每种花选取25个数据,注意标签要和数据一一对应
dataSet = np.vstack((iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack((iris.target[0:25], iris.target[50:75], iris.target[100:125]))

# 创建KNN分类器
# 1.sklearn 中的算法都被包装成面向对象风格,因此使用算法时,要先实例化
KNN_classifier = KNN(n_neighbors=6) #规定 k = 6
# 2.fit 为训练模型的过程,由于KNN本质上无模型,但是为了和别的算法统一,将训练数据集当作模型
KNN_classifier.fit(dataSet,lable)
# 3.进行预测(分类)
X = np.vstack((iris.data[25:50, ...], iris.data[75:100, ...], iris.data[125:150, ...]))
result = KNN_classifier.predict(X)
print(result)

 

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸢尾花数据集是一个经典的用于机器学习分类问题的数据集,共有150个样本,每个样本包含4个特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,以及它们所属的3个分类:山鸢尾、变色鸢尾和维吉尼亚鸢尾。 k近邻算法是一种基于实例的学习方法,它的基本思想是通过将新数据与已知数据集中最近的k个数据进行比较,来预测新数据的分类。 在使用k近邻算法对鸢尾花数据集进行分类时,我们先将数据集分为训练集和测试集。然后,对于测试集中的每个样本,我们计算它与训练集中所有样本的距离,并选出距离最近的k个样本。最后,根据这k个样本的分类来预测测试集中样本的分类,并计算预测准确率。 下面是使用Python的scikit-learn库实现k近邻算法对鸢尾花数据集分类的代码示例: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # 加载数据集 iris = load_iris() # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42) # 创建k近邻分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练模型 knn.fit(X_train, y_train) # 预测测试集分类 y_pred = knn.predict(X_test) # 计算准确率 accuracy = knn.score(X_test, y_test) print("Accuracy:", accuracy) ``` 运行结果: ``` Accuracy: 0.9777777777777777 ``` 从结果可以看出,使用k近邻算法对鸢尾花数据集分类的准确率达到了97.78%。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值