原生Python机器学习分类之一Knn算法

分类算法是解决分类问题的方法,是数据挖掘、机器学习和模式识别中一个重要的研究领域。分类算法通过对已知类别训练集的分析,从中发现分类规则,以此预测新数据的类别。分类算法的应用非常广泛,银行中风险评估、客户类别分类、文本检索和搜索引擎分类、安全领域中的入侵检测以及软件项目中的应用等等。
数据是通过本地读取csv文件
其中前50行为Iris-setosa,中间50行为Iris-versicolor,最后50行为Iris-virginica,共150行数据


#-*- coding: UTF-8 -*-   
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
# 四个特征分别为花萼长度sepal length,花萼宽度sepal width,花瓣长度petal length,花瓣宽度petal width。
# 鸢尾花的种类,共有3种,分别为山鸢尾Iris Setosa、杂色鸢尾Iris Versicolour、维吉尼亚鸢尾Iris Virginica
class knnTest:
    k=0;
    train_x=np.array([])
    train_y=np.array([])
    #初始化
    def __init__(self,k):
        self.k=k
        return None
    #装载
    def fit(self,train_x,train_y):
        self.train_x=np.array(train_x)
        self.train_y=np.array(train_y)
        return None
    #预测
    def knn(self,test_x,test_y,train_x,train_y):
        self.fit(train_x,train_y)
        result = []
        test_x=np.asarray(test_x)
        for i in test_x:
            # 对于测试集中的每一个样本,依次与训练集中的所有样本求距离。
            dis = np.sqrt(np.sum((i - self.train_x) ** 2, axis=1))
            # 返回数组排序后,每个元素在原数组中的索引
            index = dis.argsort()
            # 取距离最近的k个元素的索引
            index = index[:self.k]
            # 返回数组中每个元素出现的次数
            count = np.bincount(self.train_y[index])
            # 最大元素索引,即出现次数最多的元素
            result.append(count.argmax())
        return result
#
def main():
    Knn=knnTest(k=5)
    # 四个特征分别为花萼长度sepal-length,花萼宽度sepal-width,花瓣长度petal-length,花瓣宽度petal-width。
    # 鸢尾花的种类,共有3种,分别为山鸢尾Iris-Setosa、杂色鸢尾Iris-Versicolour、维吉尼亚鸢尾Iris-Virginica
    data = pd.read_csv('iris.data.csv',names=["sepal-length","sepal-width","petal-length","petal-width","Species"])
    # 将类别文本映射为数值类型
    data['Species'] = data['Species'].map({'Iris-setosa':0,'Iris-versicolor':1,'Iris-virginica':2})
    # 提取出每个类别的鸢尾花数据
    t0 = data[data['Species'] == 0]
    t1 = data[data['Species'] == 1]
    t2 = data[data['Species'] == 2]
    # print(data)
    # 对每个类别数据进行打乱洗牌
    t0 = t0.sample(len(t0), random_state=0)  #50行
    t1 = t1.sample(len(t1), random_state=0)  #50行
    t2 = t2.sample(len(t2), random_state=0)  #50行
    # 构建训练集和测试集
    train_x = pd.concat([t0.iloc[:40, :-1], t1.iloc[:40, :-1], t2.iloc[:40, :-1]], axis=0) #120行
    # print("train_x")
    # print(train_x)
    train_y = pd.concat([t0.iloc[:40, -1], t1.iloc[:40, -1], t2.iloc[:40, -1]], axis=0) #120行
    # print("train_y")
    # print(train_y)
    test_x = pd.concat([t0.iloc[40:, :-1], t1.iloc[40:, :-1], t2.iloc[40:, :-1]], axis=0) #30行
    # print("test_x")
    # print(test_x)
    test_y = pd.concat([t0.iloc[40:, -1], t1.iloc[40:, -1], t2.iloc[40:, -1]], axis=0) #30行
    # print("test_y")
    # print(test_y)
    result = Knn.knn(test_x,test_y,train_x,train_y)
    print("鸢尾花品种映射关系:'Iris-setosa':0,'Iris-versicolor':1,'Iris-virginica':2")
    print("鸢尾花预测命中率result_rate:",np.sum(result == test_y)/len(result))
    # for i in range(len(result)):
    #     if result[i]==0:
    #         result[i]="Iris-setosa"
    #     elif result[i] == 1:
    #         result[i]="Iris-versicolor"
    #     else :
    #          result[i]="Iris-virginica"
    print("鸢尾花预测品种result_name:",result)
    return None

if  __name__ == '__main__':
    main()

运行结果

原文地址:https://www.cnblogs.com/hrdate/p/15524863.html