KNN算法简单实例:
1、题目描述:
利用KNN算法对鸢尾花的品种做预测。
2、题目分析:
此题采用KNN算法进行预测,即监督算法,数据集分为训练集和测试集,训练集用于KNN算法模型的训练,而测试集用于测试该模型的泛化能力。
3、算法设计:
首先计算训练数据与测试数据之间的欧氏距离,然后根据距离进行排序,之后提取top k近邻,最后计算邻居中出现次数最多的类并输出结果。
4、调试过程:
1、
调试时出现上述错误,经排查是因为只能连接列表(不是“str”)到列表,即输出时这里我将列表和字符串连在一起进行输出产生错误,只需将两部分拆开输出即可。
2、
错误:list对象没有属性shape,即list对象不能使用shape函数求矩阵维度,这是因为新定义的测试集没有将其通过DataFrame函数进行框架的转换,进行如下转换后运行正常。
5、程序源代码:
-- coding: utf-8 --
#导入库
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import os
import operator
import csv
#读取数据
data=pd.read_csv(os.getcwd() + ‘\data’ + os.sep + ‘iris.csv’)
#输出数据
print(data)
#绘制散点图
def draw_iris_data(csvpath=‘data/iris.csv’):
#用于存储三个类别的鸢尾花的数据
x_list=[]
y_list=[]
x_list_second=[]
y_list_second=[]
x_list_third=[]
y_list_third=[]
#从文件中读取数据
csv_reader=csv.reader(open(csvpath))
#遍历将数据分别保存至相应类别列表中
for one_line in csv_reader:
if one_line[0]!=‘Sepal.Length’ and one_line[4]‘setosa’:
x_list.append(one_line[0])
y_list.append(one_line[1])
if one_line[0]!=‘Sepal.Length’ and one_line[4]‘versicolor’:
x_list_second.append(one_line[0])
y_list_second.append(one_line[1])
if one_line[0]!=‘Sepal.Length’ and one_line[4]‘virginica’:
x_list_third.append(one_line[0])
y_list_third.append(one_line[1])
#设置xy坐标
plt.xlabel(‘sepal-length’)
plt.ylabel(‘sepal-width’)
plt.title(“iris_data_pic”)
#设置三种鸢尾花的散点图颜色
plt.scatter(x_list,y_list,c=‘g’,marker=’.’)
plt.scatter(x_list_second,y_list,c=‘r’,marker=’.’)
plt.scatter(y_list_third,y_list,c=‘b’,marker=’.’)
plt.legend(‘x1’)
#画图
plt.show()
#绘制散点图
def draw_iris_data_second(csvpath=‘data/iris.csv’):
#用于存储三个类别的鸢尾花的数据
m_list=[]
n_list=[]
m_list_second=[]
n_list_second=[]
m_list_third=[]
n_list_third=[]
#从文件中读取数据
csv_reader=csv.reader(open(csvpath))
#遍历将数据分别保存至相应类别列表中
for one_line in csv_reader:
if one_line[2]!=‘Petal.Length’ and one_line[4]‘setosa’:
m_list.append(one_line[2])
n_list.append(one_line[3])
if one_line[2]!=‘Petal.Length’ and one_line[4]‘versicolor’:
m_list_second.append(one_line[2])
n_list_second.append(one_line[3])
if one_line[2]!=‘Petal.Length’ and one_line[4]‘virginica’:
m_list_third.append(one_line[2])
n_list_third.append(one_line[3])
#设置xy坐标
plt.xlabel(‘petal-length’)
plt.ylabel(‘petal-width’)
plt.title(“iris_data_pic”)
#设置三种鸢尾花的散点图颜色
plt.scatter(m_list,n_list,c=‘g’,marker=’.’)
plt.scatter(m_list_second,n_list_second,c=‘r’,marker=’.’)
plt.scatter(m_list_third,n_list_third,c=‘b’,marker=’.’)
plt.legend(‘x1’)
#画图
plt.show()
#定义一个函数来计算两个数据点之间的欧氏距离
def CalculateDistance(data1, data2, length):
distance = 0
for x in range(length):
distance += np.square(data1[x] - data2[x])
return np.sqrt(distance)
#定义KNN模型
def knn(trainingSet, testInstance, k):
length = testInstance.shape[1]
distances = {}
#计算训练数据与测试数据之间的欧氏距离
for x in range(len(trainingSet)):
dist = CalculateDistance(testInstance, trainingSet.iloc[x], length)
distances[x] = dist[0]
#根据距离来排序
sorted_d = sorted(distances.items(), key=operator.itemgetter(1))
neighbors = []
#提取top k近邻
for x in range(k):
neighbors.append(sorted_d[x][0])
classVotes = {}
#计算邻居中出现次数最多的类
for x in range(len(neighbors)):
answer = trainingSet.iloc[neighbors[x]][-1]
if answer in classVotes:
classVotes[answer] += 1
else:
classVotes[answer] = 1
sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)
return(sortedVotes[0][0], neighbors)
#创建一个测试集
testSet = [[7.0, 3.0, 5.1, 2.5]]
test = pd.DataFrame(testSet)
print(‘测试数据’,end=’’)
print(testSet)
#设置k为1
k = 1
print(‘k=1时即选取一个邻居来判断时结果为:’)
result,neighbor = knn(data, test, k)
print(result)
print(‘最近的邻居:’)
print(neighbor)
#设置k为3
k = 3
print(‘k=3时即选取三个邻居来判断时结果为:’)
result,neighbor = knn(data, test, k)
print(result)
print(‘最近的邻居:’)
print(neighbor)
#设置k为5
k = 5
print(‘k=5时即选取五个邻居来判断时结果为:’)
result,neighbor = knn(data, test, k)
print(result)
print(‘最近的邻居:’)
print(neighbor)
draw_iris_data()
draw_iris_data_second()
6、运行截图:
7、总结:
经过这次的机器学习KNN算法实战,我加深了对机器学习的理解,更进一步理解到实践的重要性,机器学习实践非常重要,只有做好实践工作,才能真正学习好机器学习。机器学习同样也是十分重要的一门技术课程,掌握好这门课程可以让许多需要花费机械的、大量的时间的工作变得事半功倍。尤其可见机器学习的意义是十分深远的。