1、相关 python 库函数导入:
# 导包
import numpy as np
import operator as op
from sklearn.datasets import load_iris #导入数据所需库
from sklearn.model_selection import train_test_split #数据分割所需库
2、原始数据的生成以及数据处理:
iris_dataset = load_iris()
# 查看数据说明。
print(iris_dataset.DESCR)
# 将数据分割(分为训练集和测试集)
from sklearn.model_selection import train_test_split
'''
一共150组数据:
112个训练数据;
38个测试数据;
'''
X_train, X_test, y_train, y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'], random_state=0
)
3、自定义 knn 算法实现单个鸢尾花种类的预测:
'''
自定义 knn 算法:
new_data:待预测数据
old_data_x:输入的训练数据集(x_train)
old_data_y:输入的训练集的类别标签(y_train)
k:临近数
'''
def KNNClass(new_data, old_data_x, old_data_lables, k):
Sample = old_data_x.shape[0]
# 计算预测数据与已知数据的距离
# distance = ((np.tile(new_data,(old_data,1)) - old_data)**2)**0.5
diffMat = np.tile(new_data, (Sample, 1)) - old_data_x # numpy.tile进行数组的重复生成
sqdiffMat = diffMat ** 2
sqDistances = sqdiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() # 返回的是数组值从小到大的索引值
classCount = {}
for i in range(k):
# 第i个近邻点在distance数组中的索引,对应的分类
votelabel = old_data_lables[sortedDistIndicies[i]]
classCount[votelabel] = classCount.get(votelabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=op.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
4、利用 KNNClass (自定义knn算法) 预测所有的鸢尾花种类:
# 一共 38 组测试数据,使用自定义 KNNClass 来计算准确率
count = 0 #计算正确的个数
list_KNNClass = [] # KNNClass 得到的结果
for i in range(38):
list_KNNclass = KNNClass(arry_x_test[i], arry_x_train, arry_y_train, 5)
if list_KNNclass == y_test[i]: # 5 临近
list_KNNClass.append(list_KNNclass)
count +=1
else:
continue
5、输出相应的结果集:
print("KNNClass 得到的结果为:{}".format(list_KNNClass))
print("测试数据:{}".format(y_test))
print("KNNClass 准确率为:{:.2f}".format(count/38))
完整代码如下:
# 导包
import numpy as np
import operator as op
# 导入数据
from sklearn.datasets import load_iris
iris_dataset = load_iris()
# 查看数据说明。
print(iris_dataset.DESCR)
# 将数据分割(分为训练集和测试集)
from sklearn.model_selection import train_test_split
'''
一共150组数据:
112个训练数据;
38个测试数据;
'''
X_train, X_test, y_train, y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'], random_state=0
)
'''
自定义 knn 算法:
new_data:待预测数据
old_data_x:输入的训练数据集(x_train)
old_data_y:输入的训练集的类别标签(y_train)
k:临近数
'''
def KNNClass(new_data, old_data_x, old_data_lables, k):
Sample = old_data_x.shape[0]
# 计算预测数据与已知数据的距离
# distance = ((np.tile(new_data,(old_data,1)) - old_data)**2)**0.5
diffMat = np.tile(new_data, (Sample, 1)) - old_data_x # numpy.tile进行数组的重复生成
sqdiffMat = diffMat ** 2
sqDistances = sqdiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() # 返回的是数组值从小到大的索引值
classCount = {}
for i in range(k):
# 第i个近邻点在distance数组中的索引,对应的分类
votelabel = old_data_lables[sortedDistIndicies[i]]
classCount[votelabel] = classCount.get(votelabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=op.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# 构建邻居数为 5 的 knn 模型 -------通过自定义 KNNClass
# 1、格式转换--------将 数据集转化为 arry 形式以便计算
arry_x_train = np.array(X_train)
arry_x_test = np.array(X_test)
arry_y_train = np.array(y_train)
arry_y_test = np.array(y_test)
y_true = KNNClass(arry_x_test[10], arry_x_train, arry_y_train, 5)
# 一共 38 组测试数据,使用自定义 KNNClass 来计算准确率
count = 0 #计算正确的个数
list_KNNClass = [] # KNNClass 得到的结果
for i in range(38):
list_KNNclass = KNNClass(arry_x_test[i], arry_x_train, arry_y_train, 5)
if list_KNNclass == y_test[i]: # 5 临近
list_KNNClass.append(list_KNNclass)
count +=1
else:
continue
print("KNNClass 得到的结果为:{}".format(list_KNNClass))
print("测试数据:{}".format(y_test))
print("KNNClass 准确率为:{:.2f}".format(count/38))
结果截图: