KNN分类算法与鸢尾花分类任务

1. 鸢尾花分类步骤

1.1 分析问题,搞定输入和输出

  • 输入:花;
  • 输出:类别
  • 如何数字化一个实体(entity)?
    • 用这个实体的特征/属性来刻画这个实体!!!
    • 四个属性:花瓣长,花瓣宽,花萼长,花萼宽
  • 输出:从零开始编号:0, 1, 2 …(zero index),鸢尾花一共3类
  • 一个样本:花瓣长,花瓣宽,花萼长,花萼宽,类别编号

1.2 每个类别各采集50朵花

  • 花瓣长1,花瓣宽1,花萼长1,花萼宽1,类别编号1
  • 花瓣长2,花瓣宽2,花萼长2,花萼宽2,类别编号2
  • 花瓣长3,花瓣宽3,花萼长3,花萼宽3,类别编号3
  • 花瓣长150,花瓣宽150,花萼长150,花萼宽150,类别编号150

1.3 选择一种算法,完成输入到输出的映射

  • 分类算法
    • KNN:K紧邻算法
    • GNB:高斯贝叶斯
    • DT:决策树算法
    • SVM:支持向量机
    • RF:随机森林算法
    • 集成学习算法

1.4 第四步:部署,集成

2. KNN算法原理

2.1 基本概念

  • KNN: K-Nearest Neighbors K个最近的邻居,所以也叫 K-近邻 算法

2.2 核心理念

  • 近朱者赤,近墨者黑
  • 跟什么样的人在一起,你就会变成什么样的人!!!

2.3 训练

  • 惰性计算算法
  • 规则 + 数据,不是严格意义上的人工智能算法

2.4 推理流程

  • 给定一朵花,如何判定它是第几类?
  • 第一步:找出这朵花 K 个最近的邻居(最好的兄弟,闺蜜)
    • 相似度的度量
      几何视角: 1. 欧式空间,距离计算,2. 勾股定理
      • 向量视角:1. 余弦相似度
  • 第二步:K个邻居进行投票,选出类别出现次数最多的类

3. 使用 sklearn 完成分类任务

3.1 代码实现

  • knn_demo
from sklearn.datasets import load_iris
# 加载数据
X,y = load_iris(return_X_y=True)
print(X.shape,y.shape)
# 数据集切分
from sklearn.model_selection import train_test_split
# 参数:shuffle=True:打乱数据集,random_state=0 指定随机种子,方便复现结果
X_train,X_test,y_train,y_test =  train_test_split(X,y,test_size=0.2,shuffle=True,random_state=0)

# 引入一个模型
from sklearn.neighbors import KNeighborsClassifier  
# 1.构建模型
knn=KNeighborsClassifier(n_neighbors=3)
# 2.训练模型
knn.fit(X_train,y_train)
# 3.预测
y_pred=knn.predict(X_test)
print(y_pred)
print(y_test)
print(y_pred==y_test)
# 4.评估模型
acc = (y_pred==y_test).mean()
print(acc)


# 决策树
from sklearn.tree import DecisionTreeClassifier
# 构建模型
dtc = DecisionTreeClassifier()
# 训练模型
dtc.fit(X_train,y_train)
# 预测
y_pred = dtc.predict(X_test)
# 评估模型
acc = (y_pred==y_test).mean()
print(acc)

# 支持向量机
from sklearn.svm import SVC
svc = SVC()
svc.fit(X_train,y_train)
y_pred = svc.predict(X_test)    
acc = (y_pred==y_test).mean()
print(acc)


# 以下是自己手动写一个KNN的过程
import joblib
joblib.dump(value=knn, filename="knn.aura")

class MyKNeighborsClassifier(object):
    """
        自定义KNN分类器算法
    """
    def __init__(self, n_neighbors=5):
        """
            初始化方法:
                - 输入:
                    - 超参 Hyper-Parameter(人为置顶的,不是系统学习的)
                - 输出:
                    - 没有输出
        """
        # 超参设置
        self.n_neighbors = n_neighbors
        
    
    def fit(self, X, y):
        """
            训练过程
             - 输入:
                 - X:训练集的特征(矩阵)
                 - y:训练集的标签(向量)
            - 输出:
                - 无输出
        """
        import numpy as np
        
        # 类型转换
        X = np.array(X)
        y = np.array(y)
        
        # 形状校验
        if X.ndim != 2 or y.ndim != 1 or X.shape[0] != y.shape[0]:
            raise ValueError("入参有误")
        
        # 把训练集挂载到模型上
        self.X = X
        self.y = y
    
    def predict(self, X):
        """
            预测过程:
                - 输入:
                    - X:待预测的样本的特征(批量)
                - 输出:
                    - y:预测的类别
        """
        import numpy as np
        from collections import Counter
        
        # 类型转换
        X = np.array(X)
        
        # 形状校验
        if X.ndim != 2 or X.shape[1] != self.X.shape[1]:
            raise ValueError("入参有误")
        
        # 推理过程
        results = []
        for x in X:
            distances = np.sqrt(((self.X - x) ** 2).sum(axis=-1))
            idxes = np.argsort(distances)[:self.n_neighbors]
            labels = self.y[idxes]
            label = Counter(labels).most_common(1)[0][0]
            results.append(label)
        return np.array(results)

# 1, 构建模型
my_knn = MyKNeighborsClassifier()

# 2,训练
my_knn.fit(X=X_train, y=y_train)

# 3, 预测
y_pred = my_knn.predict(X=X_test)

print(y_pred)
print(y_test)

acc = (y_pred == y_test).mean()
print(acc)
  • 模型部署
import joblib
knn = joblib.load(filename="knn.aura")

# 预测  数据都是批量预测的,所以要写成二维结构,就算是一个数据,也要假装是多个
import numpy as np
X = np.array([[6.3,3.3,6.,2.5]])
print(X.shape)
result = knn.predict(X=X)
print(result)

3.2 输出结果

在这里插入图片描述

4. 距离度量

计算内积

计算模

计算余弦相似度

import numpy as np
a = np.array([2, 5])
b = np.array([1, 8])
d = np.sqrt(((a - b) ** 2).sum())
d

3.1622776601683795

# 手动计算 a 和 b 的内积
(a * b).sum()

42

# 计算内积更优雅的方式
a @ b

42

# 这样也能计算内积
np.dot(a, b)

42

# 同样是计算内积
a.dot(b)

42

# 手动计算 a 的模
np.sqrt((a ** 2).sum())

5.385164807134504

# 计算 a 的模更优雅的方式,使用 numpy 效率更高
np.linalg.norm(a)

5.385164807134504

# 余弦相似度
cosine_similarity = a @ b / np.linalg.norm(a) / np.linalg.norm(b)
cosine_similarity

0.9673722233802454

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
kNN(k近邻)是一种常用的机器学习算法,用于分类问题。而尾花数据集是一个广为人知且经常用于实践的数据集之一。下面将介绍如何使用R语言来进行kNN分类尾花。 首先,我们需要加载相关的R包,包括"class"和"caret"。这些包提供了kNN算法的实现和数据集的处理功能。 然后,我们可以通过R语言内置的命令`data(iris)`来加载尾花数据集。这个数据集包含150个样本,每个样本有4个特征,分为3个类别。 接下来,我们可以将数据集分为训练集和测试集,用于模型的训练和评估。可以使用`createDataPartition`函数从数据集中随机选取样本,设置比例,将其分为训练集和测试集。 现在,我们可以使用kNN算法尾花数据集进行分类。使用`knn`函数,我们可以指定k值,并将训练集和测试集作为参数传入。这个函数将根据训练集的特征和类别,为测试集中的数据点预测一个类别。 最后,我们可以使用评估指标(如准确率)来评估模型的性能。我们可以使用`confusionMatrix`函数计算分类准确率,并将预测结果和真实类别进行对比。 整个过程如下所示: ``` # 加载相关包 library(class) library(caret) # 加载尾花数据集 data(iris) # 分割数据集为训练集和测试集 set.seed(123) trainIndex <- createDataPartition(iris$Species, p = 0.7, list = FALSE) trainSet <- iris[trainIndex, ] testSet <- iris[-trainIndex, ] # 使用kNN算法进行分类 k <- 5 predicted <- knn(trainSet[,1:4], testSet[,1:4], trainSet$Species, k) # 评估模型性能 cm <- confusionMatrix(predicted, testSet$Species) accuracy <- cm$overall["Accuracy"] # 输出结果 print(accuracy) ``` 通过以上步骤,我们可以使用R语言中的kNN算法尾花数据集进行分类,并获得模型的准确率作为评估指标。这是一个简单的例子,可以用于学习和实践kNN算法分类任务

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MechMaster

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

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

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

打赏作者

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

抵扣说明:

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

余额充值