zoukankan      html  css  js  c++  java
  • 原生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()
    

    运行结果

  • 相关阅读:
    Mvc4.0添加商品到Cookie
    个人作业——词频统计
    利用飞信虚拟框架开发绿色.NET程序
    专用服务器和共享服务器的区别(转)
    我做项目对Excel进程处理问题
    通过SQL Server 2000的链接服务器访问Sybase数据库
    结合地理信息系统开发的项目
    模仿Smartphone的开始菜单效果
    如何修改Windows Mobile手机系统颜色
    个人负责的第一个地图应用项目框架截图
  • 原文地址:https://www.cnblogs.com/hrdate/p/15524863.html
Copyright © 2011-2022 走看看