课程实验报告,从前人的总结分享中学习借鉴了很多,上传记录,或许能帮到有需要的人。
任务一:
(1)从sklean中导入iris数据集
(2)从CSV文件中导入iris数据集
任务二:
(1)利用sklearn中的model_selection.train_split()函数将样本集划分为训练集和测试集
(2)定义一个函数plot_points(),该函数的功能是绘制出训练集中样本的散点图(为实现数据可视化,只利用鸢尾花样本集中的任意两个特征)
任务三:编写感知器算法,对山鸢尾花和非山鸢尾花进行分类
任务四:编写k-近邻算法,对测试集中的鸢尾花进行分类,并计算分类准确度
任务五:编写k-means聚类算法,对全体样本集中的鸢尾花进行分类,分析聚类性能。
模式识别课程设计报告
目录
1.Iris鸢尾花数据集
1.1 Iris鸢尾花数据集介绍
1.2 第三方库介绍
1.3 Iris鸢尾花数据集的导入
1.3.1 从Sklearn中导入Iris数据
1.3.2 从本地CSV文件中导入Iris数据集
1.4 样本集数据的处理、可视化及代码说明
2.Iris鸢尾花分类算法和实现
2.1 感知器算法完成对山鸢尾花和非山鸢尾花的分类
2.1.1 感知器算法原理
2.1.2 关键代码解释说明
2.1.3 运行结果及分析
2.2 K-近邻算法完成测试集鸢尾花分类
2.2.1 K-近邻算法原理
2.2.2 关键代码解释说明
2.2.3 运行结果及分析
2.3 K-Means算法完成鸢尾花聚类
2.3.1 K-Means算法原理
2.3.2 关键代码解释说明
2.3.3 运行结果及分析
3. 课程设计总结
参考资料
附录一.Iris样本集本地CSV文件
附录二.源码py源码
1.Iris鸢尾花数据集
1.1 Iris鸢尾花数据集介绍
Iris数据集是常见的分类实验数据集,由Fisher,1936年收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。[1]鸢尾花数据集最初由Edgar Anderson 在加拿大加斯帕半岛上,于同一天的统一时间段,使用相同的测量仪器测量得到;而后在著名的统计学家和生物学家R.A.Fisher于1936年发表的文章《The use of multiple measurements in taxonomic problems》[2]中被使用,用其作为线性判别分析的一个例子,证明分类的统计方法,由此而被人所知。
鸢尾花样本集共收集了三类鸢尾花,即Setosa(山鸢尾花)、Versicolour(杂色鸢尾花)、Virginica(维吉尼亚鸢尾花),每一条鸢尾花收集了50条样本记录,共150条;包含的三种鸢尾花的四个特征值(data)和一个目标值(target),四个特征值分别是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm),目标值为三种不同类型的鸢尾花的类别标记。
实验提供了鸢尾花(Iris)样本集的本地CSV文件(见附录1)供使用,也可以使用Python的机器学习库Sklearn中集成的Iris样本集
1.2 第三方库介绍
NumPy库简介
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
Matplotlib简介
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表,可根据数据集(DataFrame,Series)自行定义x,y轴,绘制图形(线形图,柱状图,直方图,密度图,散布图等等),能够解决大部分的需要。Matplotlib中最基础的模块是pyplot。
SKlearn简介
scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。
1.3 Iris鸢尾花数据集的导入
1.3.1从Sklearn中导入Iris数据
Sklearn包datasets模块导入
#从sklearn包datasets模块导入数据集并返回from sklearn import datasets def load_iris_sklearn():data = datasets.load_iris().datatarget = datasets.load_iris().targetreturn data, target
1.3.2 从本地CSV文件中导入Iris数据集
打开CSV文件利用到了pandas库中的read_csv函数,经过处理后使得和从Sklearn中导入的Iris数据从格式上相一致(数据data以150个四维数组组成的numpy数组集形式返回,标签target以150个一维就组成的数组集返回,其中0代表Setosa(山鸢尾花)、标签1代表ersicolour(杂色鸢尾花)、标签2代表Virginica(维吉尼亚鸢尾花)),返回结果这里不进行展示。
#从本地CSV文件iris.csv文件里导入数据集处理文件后返回 def load_iris_csv():path = 'iris.csv'data = np.array(pd.read_csv(path, delimiter=',', header=None, usecols=[0, 1, 2, 3]).values.tolist())target_ = pd.read_csv(path, delimiter=',', header=None, usecols=[4, ])target_.replace('setosa', 0, inplace=True)target_.replace('versicolor', 1, inplace=True)target_.replace('virginica', 2, inplace=True)target = np.array(target_.values.tolist()).flatten()return data, target
后面的算法均使用load_iris_sklearn()函数从Sklearn中导入Iris数据。
1.4 样本集数据的处理、可视化及代码说明
返回的鸢尾花数据数据需利用sklearn库中model_selection模块中的train_test_split函数进行训练集和测试机的分割。
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train_data和test_data,形式为:
data_train, data_test, target_train, target_test = train_test_split(data, target, test_size=0.3, shuffle=None)
data:所要划分的样本特征集
target:所要划分的样本结果
test_size:样本占比,如果是整数的话就是样本的数量
shuffle:洗牌模式
该函数为随机抽取划分,所以使得后续的算法训练和算法准确度产生随机性和不确定性。我取30%作为样本测试集,70%数据为训练样本集,后面的程序运行结果和测试率仅展示部分结果,对于算法准确率取20次的平均值。
可视化用到matplotlib中的pyplot模块,这里不做详细描述。
将利用train_test_split函数分得的训练集以任意两种特征为X,Y轴数据进行二维平面绘图,结果如图:
从二维特征点图可以看出,山鸢尾花和非山鸢尾花的区别较大,变色鸢尾花和弗吉尼亚鸢尾花的差别较小,瓣长和瓣宽的区别最为明显。
代码如下:
#从本地CSV文件iris.csv文件里导入数据集处理文件后返回 def load_iris_csv():path = 'iris.csv'data = np.array(pd.read_csv(path, delimiter=',', header=None, usecols=[0, 1, 2, 3]).values.tolist())target_ = pd.read_csv(path, delimiter=',', header=None, usecols=[4, ])target_.replace('setosa', 0, inplace=True)target_.replace('versicolor', 1, inplace=True)target_.replace('virginica', 2, inplace=True)target = np.array(target_.values.tolist()).flatten()return data, target
2.Iris鸢尾花分类算法和实现
2.1 感知器算法完成对山鸢尾花和非山鸢尾花的分类
编写感知器算法,对山鸢尾花和非山鸢尾花进行分类
2.1.1 感知器算法原理
感知机(Perceptron)在1957年由Rosenblatt提出,是神经网络和支持向量机的基础。感知机是一种二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,+1代表正类,-1代表负类。感知机属于判别模型,它的目标是要将输入实例通过分离超平面将正负二类分离。
感知器算法基本步骤:
(1)任意选择初始的权向量α(0),置t=0;
(2)考察样本yj ,若α(t)Tyj≤0,则α(t+1)=α(t)+yj
(3)考察另一个样本,重复(2),直至对所有样本都有α(t)Tyj>0,即
JP(α)=0[3]
一个实例点被误分类,即位于分离超平面的错误一侧时,则调整w,b的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直至超平面越过该误分类点使其被正确分类。
感知机预测过程:对于新输入实例的特征向量,输入到h(x)=sign(wx+b),输出对应类别。[4]
2.1.2 关键代码解释说明
由于感知器算法线性可分分类器,对于山鸢尾花和非山鸢尾花标签分别设置为1和-1,从1.3.4 样本集数据的处理、可视化及代码说明部分的运行结果可知山鸢尾花和非山鸢尾花线性可分,另外我取萼长和萼宽做为判断特征。
代码见:附件Perceptrons.py
Perceptron函数用于实现感知器分类器算法,利用划分后的训练集数据和对应标签集进行迭代运算,返回最终结束分类的参数w和w0
# 分类器算法实现 def perceptron(points_, labels_):# 分类结果的boolean数组,True为错分# 参数初始化w = np.array([1, 1])w0 = np.array([0])step = 1k = 0# idx_mis为boolean数组# 分类结果的boolean数组,True为错分def findMisPointsIndex(points, labels, w, w0):return -labels * (w.dot(points.T) + w0) >= 0idx_mis = findMisPointsIndex(points_, labels_, w, w0)# 若存在误分样本点,则进入迭代while idx_mis.any():dw = labels_[np.where(idx_mis)[0][0]] * points_[np.where(idx_mis)[0][0]]dw0 = labels_[np.where(idx_mis)[0][0]]w = w + dww0 = w0 + dw0idx_mis = findMisPointsIndex(points_, labels_, w, w0)return points_, labels_, w, w0
getAccurcy函数用于将测试集数据代入某算法得到的预测标签集和实际标签集进行对比运算,返回算法预测成功率。后面的算法分析也会用到该函数,之后不再赘述。
# 计算预测准确率
def getAccurcy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x] == predictions[x]:
correct += 1
return float(correct / float(len(testSet)))
perceptron_predit函数用于将测试集数据代入经过感知器算法得到的参数构成的函数中进行判断,当结果大于1时判断为正类,否则为负类。将得到的预测类别集与实际类别集进行对比,利用getAccury函数返回准确率。
# 得到预计得类别集并返回预测准确率
def perceptron_predit(data_test_, target_test_):points_, labels_, w_, w0_ = perceptron(data_train, target_train)target_test_predit = np.where(data_test_[:, 1] + ((w_[0]) * data_test_[:, 0] + w0) / w_[1] > 0, 1, -1)target_test_true = target_test_print("测试集数据的预测类别集是:")print(target_test_predit)print("测试集数据实际的类别集是:")print(target_test_true)acc = getAccurcy(target_test_true, target_test_predit)return acc
主函数部分
data, target = load_iris_sklearn() data = data[:, 0:2] # 取萼长和萼宽为判别特征 target = np.where(target == 0, 1, -1) # 将山鸢尾花标签为1,非山鸢尾花标签为-1 data_train, data_test, target_train, target_test = train_test_split(data, target, test_size=0.3, shuffle=None) points, labels, w, w0 = perceptron(data_train, target_train)#将训练集代入感知机分类器进行训练,返回w和w0# 绘制两类样本 plt.scatter(points[np.where(labels == 1), 0], points[np.where(labels == 1), 1], c='b',marker='*',s=25, label=r'山鸢尾花') plt.scatter(points[np.where(labels == -1), 0], points[np.where(labels == -1), 1], c='r',marker='s',s=25, label=r'非山鸢尾花') # 绘制分隔超平面 graphic_x = np.arange(4, 8, 0.1) graphic_y = -((w[0]) * graphic_x + w0) / w[1]plt.plot(graphic_x, graphic_y, label="分隔超平面", c='red')plt.xlabel('x1') plt.ylabel('x2') plt.legend() plt.show() acc = perceptron_predit(data_test, target_test) print(float(acc)) message_acc = '经计算,算法准确率为%f' % acc messagebox.showinfo("计算", message_acc)
2.1.3 运行结果及分析
多次运行:
20次运行算法准确率为:
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
0.933 |
0.978 |
0.978 |
1.000 |
1.000 |
0.978 |
1.000 |
1.000 |
1.000 |
0.978 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
0.978 |
0.956 |
0.956 |
1.000 |
0.978 |
1.000 |
0.978 |
0.978 |
1.000 |
1.000 |
20次运行算法平均准确率为0.983
观察可知除了小概率样本,绝大多数测试样本均能正确分类,分类结果好且稳定。
另外,由于感知器分类器时只能处理线性可分的二分类问题,而Versicolour(杂色鸢尾花)、Virginica(维吉尼亚鸢尾花)从1.4 样本集数据的处理、可视化可知两类线性不可分,所以感知机算法不能用于两者的分类。
2.2 K-近邻算法完成测试集鸢尾花分类
2.2.1 K-近邻算法原理
K-近邻算法(k-Nearest Neighbor,KNN)基于最近邻法,引入投票(vote)机制,选择前若干个离新样本最近的已知样本,用他们的列别投票来决定新样本的类别,参与投票的近邻样本个数为k而得名。[5]
该方法的思路是:在特征空间中,如果一个样本附近的k个最近 (即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
百度百科中这样描述:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。[6]
2.2.2 关键代码解释说明
从1.4 样本集数据的处理、可视化及代码说明的结果图形可以知道三类鸢尾花的花瓣长度和花瓣宽度的类间特征差异相对较大,有利于提高K近邻算法的准确度。另由于主要探究K近邻算法准确度问题,因此这里不再进行结果可视化操作。
代码见:附件KNNClassifiers
KNNclassify函数用于实现K近邻算法
# K近邻算法分类实现 def KNNclassify(data_train_, data_test_, labels, k):diff = data_train_ - data_test_# print(diff.shape[0])# 计算差值的平方和sqrDiff = diff ** 2# sum()所有元素相加,sum(0)列相加,sum(1)行相加sqrDiffSum = sqrDiff.sum(axis=1)# 计算距离distances = sqrDiffSum ** 0.5# 对所得的距离从低到高进行排序sortDistance = distances.argsort()# print(sortDistance)count = {} # 类别计数器设计for i in range(k):vote = labels[sortDistance[i]] # 取距离最小的k个样本的标签进行vote统计count[vote] = count.get(vote, 0) + 1# 对类别出现的频数从高到低进行排序降序sortCount = sorted(count.items(), reverse=True)# 返回出现频数最高的类别return sortCount[0][0]
该计算距离方法和投票排序的思想来自网络上某论坛,采用矩阵做差求多维欧式距离的方法。其优点是无论几个特征空间维度都可以代入进行K近邻分类检验。
KNN_predit函数用于将测试集代入KNN算法中得到预计类别集并和实际类别集进行对比利用getAccurcy函数返回准确率。
取K=6
# 得到K-近邻分类预计的结果类别集并返回预测准确率 def KNN_predit(data_test_, target_test_):target_test_predit = []for i in data_test_:i_test_predit = KNNclassify(data_train, i, target_train, 6)target_test_predit = np.append(target_test_predit, i_test_predit)target_test_predit = np.array(target_test_predit).astype(np.int32)target_test_true = target_test_print("测试集数据的预测类别集是:")print(target_test_predit)print("测试集数据实际的类别集是:")print(target_test_true)return getAccurcy(target_test_true, target_test_predit)
主函数部分
data, target = load_iris_sklearn()data_train, data_test, target_train, target_test = train_test_split(data, target, test_size=30, shuffle=None) acc = KNN_predit(data_test, target_test) message_acc = '经计算,以瓣长和瓣宽作为判别特征时,K近邻算法准确率为%f' % acc messagebox.showinfo("计算算法准确率", message_acc)
2.2.3 运行结果及分析
以瓣长和瓣宽作为判别特征时,多次运行结果:
20次运行算法准确率为:
1 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
10 |
0.933 |
0.933 |
0.967 |
0.933 |
0.933 |
0.933 |
0.9 |
0.967 |
1 |
11 |
12 |
13 |
15 |
16 |
17 |
18 |
19 |
20 |
0.9 |
0.933 |
0.967 |
0.967 |
1 |
0.9 |
0.967 |
1 |
0.967 |
20次运算算法平均准确率为:0.948
简单分析:分类结果较好,观察得1、2类即Versicolour(杂色鸢尾花)、Virginica(维吉尼亚鸢尾花)的错误分类较多,符合两类类间差距相对较小的特征;0类即Setosa(山鸢尾花)的分类基本不会出错。
另外,一开始其实选用的是以萼长和萼宽作为判别特征,由于1、2类即Versicolour(杂色鸢尾花)、Virginica(维吉尼亚鸢尾花)的类间差距难以区分,分类结果较差,且分类准确率受样本集划分的随机性影响很大。
如图:
而以全部特征作为判别特征时,分类较优,且准确率稳定,这里不进行展示。
另外,K取值为6是经过多次取值比较得出的一个分类较优的值,当K值过低或过高时,1、2类即Versicolour(杂色鸢尾花)、Virginica(维吉尼亚鸢尾花)的分类结果都不佳,这点在李航《统计学习方法》一书中有如下解释:
1.选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
2.选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。[7]
“K值是一种方差和偏差之间妥协”[8],也有如K折交叉验证法等便于确定较优的K值,这里不做展开讨论(没弄明白)。
2.3 K-Means算法完成鸢尾花聚类
2.3.1 K-Means算法原理
K均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,是非监督学习算法的一种,其算法思想大致为:先从样本集中随机选取K个样本作为簇中心,并计算所有样本与这k个"簇中心"的距离,对于每一个样本,将其划分到与其距离最近的"簇中心"所在的簇中,对于新的簇计算各个簇的新的"簇中心"。[9]
基本过程是:
- 选择K个数据对象,作为初始化聚类中心;
- 计算数据对象到聚类中心的距离,将数据对象划分到距离最近的数据集中;
- 重新计算每个数据集的聚类中心,然后计算所有数据对象到各个聚类中心的距离,并判断最近聚类中心是否发生变化;
- 若变化则将新的平均值点作为新的聚类中心,重复第二、三步。
2.3.2 关键代码解释说明
取巧使用了之前K均值算法实验的算法代码,如下
cluster-center_init函数用于初始化簇中心并返回簇中心
# 初始化簇中心 def cluster_center_init(points_):idxs = np.array([0, 50, 100]) # 设置样本集中的第1、第51和第101个点作为为初始簇中心centers = points_[idxs]return centers # 返回初始簇中心
这里选择第1、第51、第101个点作为初始簇中心是为了减少迭代次数,降低计算量。(还能确保0、1、2分别代表Setosa、Versicolour、Virginica,与sklearn.atasets.load_iris()中标签对应的类别情况相一致,减少工作量)
paint_clusters函数用于图形化数据,绘制每次迭代各簇的划分情况,以及簇中心点位置。
# 绘制每次迭代各簇划分情况及簇中心 def paint_clusters(i, K_, current_labels_, points_, centers):color = ['b', 'r', 'k'] # 设置不同类标记颜色markers = ['*', 'o', 's'] # 设置不同类标记符号plt.figure(i) # 设置绘图的编码为迭代计数器数predit = np.zeros(150)for k in range(K_):idxs = np.where(current_labels_ == k)[0]predit[idxs] = kplt.scatter(points_[idxs, 0], points_[idxs, 1], c=color[k], s=25, marker=markers[k])plt.scatter(centers[k, 0], centers[k, 1], color="g", s=180, marker="+")
K_Means_predit函数用于得到聚类结束后各样本点的类别并将实际类别进行对比,并利用getAccurcy函数返回K-mean聚类算法的准确率。
# 得到聚类结束后的各样本点的类别并与实际类别进行对比,返回准确率 def K_Means_predit(sum_, K_, finish_labels, target_test_true):# predit为sum_个数构成的array数组,每个数字代表每个样本点的类别标签predit = np.zeros(sum_)for k in range(K_):idxs = np.where(finish_labels == k)[0]predit[idxs] = ktarget_test_predit = predittarget_test_predit_int = target_test_predit.astype(int)print("数据的预测类别集是:")print(target_test_predit_int)print("数据实际的类别集是:")print(target_test_true)return getAccurcy(target_test_true, target_test_predit)
kmeans_clustering函数用于完成K均值聚类算法,并当clusterChanged聚类中心改变提示符指示为Flase(即聚类中心不再改变,聚类结束时)利用K_Means_predit函数得到聚类结果集以及算法准确率;而当clusterChanged聚类中心改变提示符指示为True(即聚类尚未结束)时,将每一轮迭代后的样本聚类状况和聚类中心数据利用paint_clusters函数打印出来实现聚类数据可视化。
# K均值聚类算法实现 def kmeans_clustering(num, K, points_):global current_labelsnum, dim = points_.shape # 获取样本个数centers = cluster_center_init(points_)# distances矩阵为num行,K列,每个元素存放第一个样本点到第K个簇中心的距离distances = np.zeros([num, K])clusters_labels = np.zeros(num)clustersChanged = True # (将聚类中心改变设标记器,初始为True)i = 0while clustersChanged:i = i + 1for k in range(K):center = centers[k, :]b = np.tile(center, (num, 1)) - points_distances[:, k] = np.sqrt((b ** 2).sum(axis=1))current_labels = np.argmin(distances, axis=1)paint_clusters(i, K, current_labels, points_, centers)# 判断聚类中心是否应该改变if np.all(current_labels == clusters_labels):clustersChanged = Falseelse:clusters_labels = current_labelsfor k in range(K):idxs = np.where(current_labels == k)[0]centers[k, :] = np.mean(points_[idxs, :], axis=0)acc_ = K_Means_predit(150, K, current_labels, target)# 当聚类中心不再发生变化,即聚类结束时获得聚类结果预测类别集,返回算法准确度return acc_
主函数部分
data, target = load_iris_sklearn() # data = data[:, [2, 3]] # 瓣长和瓣宽为判别特征 # data = data[:, [0, 1]] # 萼长和萼宽为判别特征 K = 3 # 聚类类别数 num = data.shape # 获取Iris数据集样本个数,150个,也可以直接将函数中num改写为150 acc = kmeans_clustering(num, K, data) plt.show() # message_acc = '经计算,以瓣长和瓣宽作为判别特征时,K-means聚类算法准确率为%f' % acc # message_acc = '经计算,以萼长和萼宽作为判别特征时,K-means聚类算法准确率为%f' % acc message_acc = '经计算,以所有特征作为判别特征时,K-means聚类算法准确率为%f' % acc messagebox.showinfo("计算算法准确率", message_acc)
2.3.3 运行结果及分析
以瓣长和瓣宽作为判别特征,且Iris样本集中的第1、第51、第101个点作为初始簇中心时,每轮迭代各簇划分状况及簇中心如图
此时聚类分类结果预测类别集和实际类别集以及准确率如下:
以萼长和萼宽作为判别特征,且Iris样本集中的第1、第51、第101个点作为初始簇中心时,则需要经过15轮迭代后聚类结束,迭代过程图略,
此时聚类分类结果预测类别集和实际类别集以及准确率如下:
另外以所有特征为判别特征,且Iris样本集中的第1、第51、第101个点作为初始簇中心时,则需要经过4轮迭代后聚类结束,聚类分类结果预测类别集和实际类别集以及准确率如下:
以瓣长和瓣宽作为判别特征,K-means算法的准确率最高,聚类效果好,而以萼长和萼宽作为判别特征时,聚类效果非常差,观察发现,0类即Setosa(山鸢尾花)分类基本正确,而后两类的分类错误较多,错误三分之二之上,这是由于K-means聚类算法的原理以及后两类鸢尾花判别特征上的相似性较高决定的。
3. 课程设计总结
通过本次课程设计,对Iris的不同分类器设计及其原理有了更深刻的认识,对如感知器算法、K近邻算法等算法的原理进行了深入的学习和编程实践,模仿着之前实验和网络上的算法代码,完成了感知器算法和K近邻算法的实验并对分类结果和分类准确率进行了研究。另外由于时间和水平限制,未能对每个算法中以不同的特征组合作为判别特征对鸢尾花分类的影响进行进一步的分析,也没有更深入对算法参数的影响测试以及实现算法性能的最优化。深入的接触才发现自己在相关知识的无知无能,只知皮毛,所缺甚多,未来也须奋进,补全今日所撼。
参考资料
[1] 百度百科IRIS数据集词条https://baike.baidu.com/item/IRIS/4061453。
[2] R.A.FISHER Sc.D.,F.R.C The use of multiple measurements in taxonomic problems[J]01 Sep 1936-Annals of Human Genetics (ANNALS OF EUGENICS)-Vol. 7, Iss: 2, pp 179-188
[3] 张学工.模式识别(第三版)[M].北京:清华大学出版社,2010 p.68
[4] 知乎 yuquan https://zhuanlan.zhihu.com/p/72040253
[5] 张学工.模式识别(第三版)[M].北京:清华大学出版社,2010 p.122
[6] 百度百科k近邻算法词条https://baike.baidu.com//item/k近邻算法/9512781
[7] 李航.统计学习方法.[M].北京:清华大学出版社,2012 [3.2.3] k值的选择
[8] 知乎 微调https://zhuanlan.zhihu.com/p/31924220
[9] 简书 没才艺的华哥.K-means聚类原理及案例分析 https://www.jianshu.com/p/b268d7f3fbb9