机器学习第一次作业

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算法实战,我加深了对机器学习的理解,更进一步理解到实践的重要性,机器学习实践非常重要,只有做好实践工作,才能真正学习好机器学习。机器学习同样也是十分重要的一门技术课程,掌握好这门课程可以让许多需要花费机械的、大量的时间的工作变得事半功倍。尤其可见机器学习的意义是十分深远的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值