KNN实现:鸢尾花数据集分类

KNN实现:鸢尾花数据集分类
KNN最近邻法的基本思想:⼀个样本与数据集中的k个样本最相似, 如果这k个样本中的⼤多数属于某⼀个类别, 则该样本也属于这个类别。
步骤:
1. 对测试集中的每个样本依次与训练集中的所有样本进⾏欧⽒距离的计算 如原数组距离为 [0.3,,0.5,0.2,0.1,0.4,0.3,0.1];
2. 将所有距离进⾏从⼩到⼤排序( [0.1,0.1,0.2,0.3,0.3,0.4,0.5]),并出每个距离在排序之前的原数组索引位置
([3,6,2,0,5,4,1]);
3. 根据k值,选取距离最近的K个元素的索引,如k = 3,则选取(3,6,2)这k个索引;
4. 根据这k个索引,寻出对应标签y中这k个索引位置的值,如(1,1,2);
5. 统计这个对应标签y中这k个索引位置的值出现的次数,如1出现了2次,2出现了1次
6. 出现次数最多的那个值,则为判定的类别,如 1 的次数最多,则判定为 1
'''采⽤鸢尾花数据集
'''
import numpy as np
from sklearn.datasets import load_iris
import pandas as pd
#head 指定第⼏⾏为标题,默认为0,若⽆标题为NOne
data = pd.read_csv('Iris.csv',header =0)
# data.head() # ⾸5⾏
# data.tail() #末尾5⾏
data.sample(10)# 默认随机抽取⼀条数据
# 将类别⽂本map映射数值类型
data['Species']= data["Species"].map({"Iris-virginica":0,"Iris-setosa":1,"Iris-versicolor":2})
# 删除不需要的ID类
data.drop('Id',axis =1,inplace =True)史阜民
data.duplicated().any()# 是否重复的数据
#删除重复的数据
data.drop_duplicates(inplace =True)
# 查看各个类别的鸢尾花具有多少记录
data["Species"].value_counts()
'''KNN⽅法实现
'''
class KNN:
# 实现k近邻⽅法分类
def__init__(self,k):
'''初始化⽅法
Parameters
k: int
邻居个数
'''
self.k = k
张代远 南京邮电大学def fit(self,X,y):
'''训练⽅法
Parameters
X: 类数组类型,形状为:[样本数量,特征数量]
带训练的样本特征(属性)
y:类数组类型,形状为:【样本数量】
每个样本的⽬标值(标签)
'''
self.X = np.array(X)
假声唱法self.y = np.array(y)
def predict(self,X):
'''根据参数传递的样本,对样本数据进⾏预测
Parameters
X: 类数组类型,形状为:[样本数量,特征数量]
带训练的样本特征(属性)
Return: 数组类型
预测结果
'''
X= np.asarray(X)
result =[]
# 对数组遍历,每次取数组中的⼀⾏数据
for x in X:
# 对于测试集中的每⼀个样本,依次与训练集中的所有样本求欧式距离
dis = np.sqrt(np.sum((x-self.X)**2,axis =1))# 欧⽒距离:矩阵中每⾏元素进⾏相加再平⽅,再更号。更号下【(x-X1)2 + x-X2)2+...+】print("dis",dis)
# 返回数组排序后,每个元素在原数组中(排序之前)的索引
index = dis.argsort()
print("index",index)
# 进⾏截断,只取前k个元素,【取距离最近的k个元素的索引】
index= index[:self.k]
print("index1",index)
# self.y[index] 出对应标签y中的值
# np.bincount()返回数组中每个元素出现的次数,元素必须是⾮负的整数
count = np.bincount(self.y[index])
print("count",count)
# 返回数组中,值最⼤元素对应的索引,索引就是我们判断的类别。也就是说y[index]中那个元素出现的最多就是哪个类别
# 最⼤元素索引就是出现次数最多的元素
result.append(count.argmax())
return np.asarray(result)
def predict2(self,X):
'''根据参数传递的样本,对样本数据进⾏预测 ( 有权重的设置)
Parameters
X: 类数组类型,形状为:[样本数量,特征数量]
带训练的样本特征(属性)
Return: 数组类型
预测结果
'''
X= np.asarray(X)
result =[]
# 对数组遍历,每次取数组中的⼀⾏数据
梦想的力量教学设计
for x in X:
# 对于测试集中的每⼀个样本,依次与训练集中的所有样本求欧式距离
dis = np.sqrt(np.sum((x-self.X)**2,axis =1))# 欧⽒距离:矩阵中每⾏元素进⾏相加再平⽅,再更号。更号下【(x-X1)2 + x-X2)2+...+】print("dis",dis)
# 返回数组中元素在排序前的位置
index = dis.argsort()
print("index",index)
# 进⾏截断,只取前k个元素,【取距离最近的k个元素的索引】
index= index[:self.k]
print("index1",index)
# self.y[index] 出对应标签y中的值
# np.bincount()返回数组中每个元素出现的次数,元素必须是⾮负的整数 :使⽤weights考虑权重,权重为距离的倒数
count = np.bincount(self.y[index],weights =1/dis[index])
count = np.bincount(self.y[index],weights =1/dis[index])
print("count",count)
# 返回数组中,值最⼤元素对应的索引,索引就是我们判断的类别
# 最⼤元素索引就是出现次数最多的元素
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)
display(result)
display(np.sum(result==test_y))# 预测正确的个数
# 使⽤带权重的进⾏测试
result2 = knn.predict2(test_X)
display(np.sum(result2 == test_y))# 预测正确的个数
import matplotlib as mpl
import matplotlib.pyplot as plt
# 默认不⽀持中⽂,设置⽀持中⽂显⽰
# 绘制训练集中三类的散点图
# "Iris-virginica":0,"Iris-setosa":1,"Iris-versicolor":2
# 设置画布的⼤⼩
plt.figure(figsize =(10,10))
plt.scatter(x = t0['SepalLengthCm'][:40],y = t0['PetalLengthCm'][:40],color ='r',label ='Iris-virginica')
plt.scatter(x = t1['SepalLengthCm'][:40],y = t1['PetalLengthCm'][:40],color ='g',label ='Iris-setosa')
plt.scatter(x = t2['SepalLengthCm'][:40],y = t2['PetalLengthCm'][:40],color ='b',label ='Iris-versicolor')
# 绘制测试集中三类的散点图
right = test_X[result == test_y]
wrong = test_X[result != test_y]
plt.scatter(x = right['SepalLengthCm'],y = right["PetalLengthCm"],color ='c',marker ='x',label ='right') plt.scatter(x = wrong['SepalLengthCm'],y = wrong["PetalLengthCm"],color ='m',marker ='>',label ='wrong')
plt.xlabel("花萼长度")
plt.ylabel("花瓣长度")
plt.title("KNN分类结果显⽰")
plt.legend(loc ='best')
plt.show()人因

本文发布于:2024-09-22 01:58:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/326247.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:样本   数据   元素
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议