IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> knn算法代码详解(以鸢尾花数据为例) -> 正文阅读

[Python知识库]knn算法代码详解(以鸢尾花数据为例)

KNN

欧氏距离:
d ( x , y ) = ∑ k = 1 n ( x k ? y k ) 2 d(x,y)=\sqrt{\sum_{k=1}^{n}{(x_k-y_k)^2}} d(x,y)=k=1n?(xk??yk?)2 ?
曼哈顿距离:
d ( x , y ) = ∑ k = 1 n ∣ x k ? y k ∣ d(x,y)=\sqrt{\sum_{k=1}^{n}{|{x_k-y_k}|}} d(x,y)=k=1n?xk??yk? ?

import numpy as np
import pandas as pd
#引入数据加载,直接引入sklearn数据,iris鸢尾花
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split#切分数据集为训练集和测试集
from sklearn.metrics import accuracy_score #计算分类预测准确率
##### 数据加载预处理
iris=load_iris()
##里面是一个封装好的字典,'data':二维数组数据,'target':分类数,'target_names':分类名称,'feature_names':特征名称
###sepal length (cm)',花儿长度;  'sepal width (cm)',花儿宽度;  'petal length (cm)',花瓣长度;  'petal width (cm)'花瓣宽度
df=pd.DataFrame(data=iris.data,columns=iris.feature_names)
df['class']=iris.target#加上一列
#更改class名称
df['class']=df['class'].map({0:iris.target_names[0],1:iris.target_names[1],2:iris.target_names[2]})
df
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)class
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
1456.73.05.22.3virginica
1466.32.55.01.9virginica
1476.53.05.22.0virginica
1486.23.45.42.3virginica
1495.93.05.11.8virginica
df.describe()
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)
count150.000000150.000000150.000000150.000000
mean5.8433333.0573333.7580001.199333
std0.8280660.4358661.7652980.762238
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000
#划分训练集和测试集
x=iris.data
y=iris.target.reshape(-1,1)#转为二维数组
##x:(150,4),y:(150,1)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=35,stratify=y)
##random_state,随机测试的种子数,后期可以调试,strarify表示根据不同层级的y对x随机分


###核心算法实现
#欧式距离
def l1_distance(a,b):
    return np.sum(np.abs(a-b),axis=1)#axis=1指的轴是一,是对矩阵运算,a中的每一行都减去b,最后保存为一列
#曼哈顿距离
def l2_distance(a,b):
    return np.sqrt(np.sum((a-b)**2,axis=1))

#分类器完成
class kNN(object):
    #定义一个初始化方法,__init__ 是类的构造方法
    def __init__(self,n_neighbors = 1,dist_func = l1_distance):#默认近邻数是一,距离使用曼哈顿距离
        self.n_neighbors = n_neighbors
        self.dist_func = dist_func
        
    #训练模型方法
    def fit(self,x,y):
        self.x_train=x
        self.y_train=y
    #模型预测方法
    def predict(self,x):#传入一组样本
        y_pred = np.zeros( (x.shape[0], 1), dtype=self.y_train.dtype )
        #y_prred与x的行数相同,列数为1
        for i,x_test in enumerate(x):
            #取出每一个x_test数据点的序号,枚举
            distances = self.dist_func(self.x_train,x_test)
            #得到的距离按照由近到远排序,返回索引值
            nn_index=np.argsort(distances)
            #选择最近的k点,先要保存他们最近的类别
            #ravel()表示降维
            nn_y = self.y_train[nn_index[:self.n_neighbors]].ravel()
            #统计类别中出现频率最高的那个
            #bincount表示按索引统计个数,argmax返回索引值,此处索引值表示类别(0或1或2)
            y_pred[i] =np.argmax(np.bincount(nn_y))
        return y_pred#输出一组预测分类
    
        
#测试
# 定义一个knn实例
knn = kNN(n_neighbors = 3)
# 训练模型
knn.fit(x_train, y_train)
# 传入测试数据,做预测
y_pred = knn.predict(x_test)
print(y_test.ravel())
print(y_pred.ravel())

# 求出预测准确率
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率: ", accuracy)
[2 1 2 2 0 0 2 0 1 1 2 0 1 1 1 2 2 0 1 2 1 0 0 0 1 2 0 2 0 0 2 1 0 2 1 0 2
 1 2 2 1 1 1 0 0]
[2 1 2 2 0 0 2 0 1 1 1 0 1 1 1 2 2 0 1 2 1 0 0 0 1 2 0 2 0 0 2 1 0 2 1 0 2
 1 2 1 1 2 1 0 0]
预测准确率:  0.9333333333333333
#定义一个实例
knn =kNN()
#训练模型
knn.fit(x_train,y_train)
#用list保存结果
result_list =[]
for p in [1,2]:
    knn.dist_func =l1_distance if p ==1 else l2_distance
    
    #考虑不同的k值,步长为2,使用奇数,减少并列第一的情况
    for k in range(1,10,2):
        knn.n_neighbors =k
        y_pred=knn.predict(x_test)
        accuracy = accuracy_score(y_test,y_pred)
        result_list.append([k,'l1_diatance' if p==1 else 'l2_diatance',accuracy])
df = pd.DataFrame(result_list,columns=['k','距离函数','预测准确率'])
df
k距离函数预测准确率
01l1_diatance0.933333
13l1_diatance0.933333
25l1_diatance0.977778
37l1_diatance0.955556
49l1_diatance0.955556
51l2_diatance0.933333
63l2_diatance0.933333
75l2_diatance0.977778
87l2_diatance0.977778
99l2_diatance0.977778

结果分析:使用含哈顿距离且k值为5-9时,预测准确率更高

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:19:14  更:2022-03-30 18:22:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 4:20:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计