基于机器学习的手写数字识别算法研究
课程设计报告
概述:
本次实验通过多种不同算法实现手写数字识别,并比较不同算法的准确率,选取最佳的算法。
数据来源:
数据来源为sklearn库自带的数据(sklearn.datasets
)中的数据(load_digits
)
并用sklearn自带的数据分割功能进行分割
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
data = load_digits()
X, y = data.data, data.target
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3)
算法的原理:
逻辑回归:
原理:
Logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
Logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
代码实现:
from sklearn.linear_model import LogisticRegression
LJHG_model = LogisticRegression(max_iter=3000)
LJHG_model.fit(train_X, train_y)
LJHG = LJHG_model.score(test_X, test_y)
决策树:
原理:
决策树是一种机器学习的方法。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
决策树是一种十分常用的分类方法,需要监管学习,监管学习就是给出一堆样本,每个样本都有一组属性和一个分类结果,也就是分类结果已知,那么通过学习这些样本得到一个决策树,这个决策树能够对新的数据给出正确的分类。
代码实现:
from sklearn.tree import DecisionTreeClassifier
JCS_model = DecisionTreeClassifier()
JCS_model.fit(train_X, train_y)
JCS = JCS_model.score(test_X, test_y)
朴素贝叶斯算法:
原理:
朴素贝叶斯(Naive Bayesian)算法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
代码实现:
from sklearn.naive_bayes import BernoulliNB
PSBYS_model = BernoulliNB()
PSBYS_model.fit(train_X, train_y)
PSBYS = PSBYS_model.score(test_X, test_y)
多层感知器(ANN):
原理:
ANN是指由大量的处理单元(神经元) 互相连接而形成的复杂网络结构,是对人脑组织结构和运行机制的某种抽象、简化和模拟。人工神经网络(Artificial Neural Network,简称ANN ),以数学模型模拟神经元活动,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。
人工神经网络有多层和单层之分,每一层包含若干神经元,各神经元之间用带可变权重的有向弧连接,网络通过对已知信息的反复学习训练,通过逐步调整改变神经元连接权重的方法,达到处理信息、模拟输入输出之间关系的目的。它不需要知道输入输出之间的确切关系,不需大量参数,只需要知道引起输出变化的非恒定因素,即非常量性参数。因此与传统的数据处理方法相比,神经网络技术在处理模糊数据、随机性数据、非线性数据方面具有明显优势,对规模大、结构复杂、信息不明确的系统尤为适用。
代码实现:
from sklearn.neural_network import MLPClassifier
SJWL_model = MLPClassifier()
SJWL_model.fit(train_X, train_y)
SJWL = SJWL_model.score(test_X, test_y)
KNN:
原理:
KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
分析:
由于K的值对结果有影响,所以可以先确定K的值来提升准确率
from sklearn.neighbors import KNeighborsClassifier
ns = range(1, 50)
acc_list = []
n_max = 0
for n in ns:
KNN_model = KNeighborsClassifier(n_neighbors=n)
KNN_model.fit(train_X, train_y)
acc = KNN_model.score(test_X, test_y)
acc_list.append(acc)
x = max(acc_list)
n_max = acc_list.index(x)+1
将K的值范围确定为1到49,依次实验并作图:
由图得,当K取1的时候准确率最高
代码实现:
from sklearn.neighbors import KNeighborsClassifier
n = 1
KNN_model = KNeighborsClassifier(n_neighbors=n)
KNN_model.fit(train_X, train_y)
KNN = KNN_model.score(test_X, test_y)
不同算法的比较:
由不同的算法得出准确率,并作图
结论:
由五种不同算法的比较图可得:逻辑回归,ANN和KNN算法的准确率都达到了90%以上。其中KNN算法的准确率最高,达到了98%以上。
KNN算法准确率较高的原因是找到了较好的K值,其他算法也可以通过调整参数的值来提高准确率。所以,人工智能现阶段最主要的还是人工调参(又回想起了数学建模大赛时被各种参数支配的恐惧)。