原生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()
运行结果