KNN算法实现&knn完成iris数据集分类

最近邻规则分类KNN

例子
KNN算法实现&knn完成iris数据集分类_第1张图片
KNN算法实现&knn完成iris数据集分类_第2张图片
KNN算法实现&knn完成iris数据集分类_第3张图片
欧氏距离
KNN算法实现&knn完成iris数据集分类_第4张图片
K值选取
KNN算法实现&knn完成iris数据集分类_第5张图片
算法缺点
KNN算法实现&knn完成iris数据集分类_第6张图片
算法实现

import matplotlib.pyplot as plt
import numpy as np
import operator

# 已知分类的数据
x1 = np.array([3,2,1])
y1 = np.array([104,100,81])
#上面是爱情片的坐标,下面是动作片的坐标
x2 = np.array([101,99,98])
y2 = np.array([10,5,2])
scatter1 = plt.scatter(x1,y1,c='r')
scatter2 = plt.scatter(x2,y2,c='b')

# 未知数据
x = np.array([18])
y = np.array([90])
scatter3 = plt.scatter(x,y,c='k')


#画图例
plt.legend(handles=[scatter1,scatter2,scatter3],labels=['labelA','labelB','X'],loc='best')

plt.show()

KNN算法实现&knn完成iris数据集分类_第7张图片

# 已知分类的数据
x_data = np.array([[3,104],
                   [2,100],
                   [1,81],
                   [101,10],
                   [99,5],
                   [98,2]])
y_data = np.array(['A','A','A','B','B','B'])
x_test = np.array([18,90])
# 计算样本数量
x_data_size = x_data.shape[0]
x_data_size

KNN算法实现&knn完成iris数据集分类_第8张图片

# 复制x_test
np.tile(x_test, (x_data_size,1))

KNN算法实现&knn完成iris数据集分类_第9张图片

# 计算x_test与每一个样本的差值
diffMat = np.tile(x_test, (x_data_size,1)) - x_data
diffMat

KNN算法实现&knn完成iris数据集分类_第10张图片

# 计算差值的平方
sqDiffMat = diffMat**2
sqDiffMat

KNN算法实现&knn完成iris数据集分类_第11张图片

# 求和
sqDistances = sqDiffMat.sum(axis=1)
sqDistances

KNN算法实现&knn完成iris数据集分类_第12张图片

# 开方
distances = sqDistances**0.5
distances

KNN算法实现&knn完成iris数据集分类_第13张图片

# 从小到大排序
sortedDistances = distances.argsort()
sortedDistances

KNN算法实现&knn完成iris数据集分类_第14张图片

classCount = {}
# 设置k
k = 5
for i in range(k):
    # 获取标签
    votelabel = y_data[sortedDistances[i]]
    # 统计标签数量
    classCount[votelabel] = classCount.get(votelabel,0) + 1
classCount

在这里插入图片描述

# 根据operator.itemgetter(1)-第1个值对classCount排序,然后再取倒序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
sortedClassCount

KNN算法实现&knn完成iris数据集分类_第15张图片

# 获取数量最多的标签
knnclass = sortedClassCount[0][0]
knnclass

KNN算法实现&knn完成iris数据集分类_第16张图片
iris分类

# 导入算法包以及数据集
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
import operator
import random
def knn(x_test, x_data, y_data, k):
    # 计算样本数量
    x_data_size = x_data.shape[0]
    # 复制x_test
    np.tile(x_test, (x_data_size,1))
    # 计算x_test与每一个样本的差值
    diffMat = np.tile(x_test, (x_data_size,1)) - x_data
    # 计算差值的平方
    sqDiffMat = diffMat**2
    # 求和
    sqDistances = sqDiffMat.sum(axis=1)
    # 开方
    distances = sqDistances**0.5
    # 从小到大排序
    sortedDistances = distances.argsort()
    classCount = {}
    for i in range(k):
        # 获取标签
        votelabel = y_data[sortedDistances[i]]
        # 统计标签数量
        classCount[votelabel] = classCount.get(votelabel,0) + 1
    # 根据operator.itemgetter(1)-第1个值对classCount排序,然后再取倒序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
    # 获取数量最多的标签
    return sortedClassCount[0][0]
# 载入数据
iris = datasets.load_iris()
# x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2) #分割数据0.2为测试数据,0.8为训练数据

#打乱数据
data_size = iris.data.shape[0]
index = [i for i in range(data_size)] 
random.shuffle(index)  
iris.data = iris.data[index]
iris.target = iris.target[index]

#切分数据集
test_size = 40
x_train = iris.data[test_size:]
x_test =  iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

predictions = []
for i in range(x_test.shape[0]):
    predictions.append(knn(x_test[i], x_train, y_train, 5))

print(classification_report(y_test, predictions))

KNN算法实现&knn完成iris数据集分类_第17张图片

print(confusion_matrix(y_test,predictions))#混淆矩阵

KNN算法实现&knn完成iris数据集分类_第18张图片
sklearn进行iris分类

# 导入算法包以及数据集
from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import random
# 载入数据
iris = datasets.load_iris()
print(iris)

KNN算法实现&knn完成iris数据集分类_第19张图片

# 打乱数据切分数据集
# x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2) #分割数据0.2为测试数据,0.8为训练数据

#打乱数据
data_size = iris.data.shape[0]
index = [i for i in range(data_size)] 
random.shuffle(index)  
iris.data = iris.data[index]
iris.target = iris.target[index]

#切分数据集
test_size = 40
x_train = iris.data[test_size:]
x_test =  iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

# 构建模型
model = neighbors.KNeighborsClassifier(n_neighbors=3)
model.fit(x_train, y_train)
prediction = model.predict(x_test)

print(classification_report(y_test, prediction))

KNN算法实现&knn完成iris数据集分类_第20张图片

你可能感兴趣的:(KNN,算法,分类,数据挖掘)