基于knn的手写数字识别代码,基于knn算法的手写识别毕业论文

  基于knn的手写数字识别代码,基于knn算法的手写识别毕业论文

  手写算法——用python代码介绍岭回归:用Python代码实现岭回归分析和良性羊;求解岭回归参数的梯度下降法:方法二:标准方程法实现岭回归,调用sklearn比较

  山脊简介

  在前两篇文章中,我们介绍了过拟合和正则化,并全面描述了L1和L2正则化的原理和特点。

  链接:原理分析-过拟合和正则化

  和python代码实现套索回归;

  链接:手写算法-python代码实现套索回归

  今天在这个基础上,我们就来说说里奇的回归,比较简单。

  本文主要实现python代码的岭回归(带L2正则项),并用实例证明原理。

  岭回归分析和python代码实现参考上一篇文章生成的数据集;

  从matplotlib导入numpy作为NP导入pyplot作为plt导入sklearn.datasets #生成100个单变量回归数据集x,y=sk learn . datasets . make _ regression(n _ features=1,Noise=5,random _ state=2020) PLT。SCASTER (x,y) PLT。SHOW () #添加5个异常数据。为什么要加他们?我们自己来看看生成的X,Y。A=NP。Linspace (1,2,5)。Reshape (-1,1) 80]) #生成一个新的数据集x _ 1=NP。R _ [x,a] Y _ 1=NP。R _ [y,b] PLT.scatter (x _ 1,y _ 1) PLT.show()

  以上分别是正常数据集和添加了5个异常数据的图像。如果线性回归直接用于拟合:

  class normal():def _ _ init _ _(self):pass def fit(self,X,y):m=X . shape[0]X=NP . concatenate((NP . ones((m,1)),X),axis=1)xMat=NP . mat(X)yMat=NP . mat(y . shape(-1,1) xTx=xmat.t * xmat # xtx.i是xtx ws=xTx的逆矩阵。我*圣诞节。T*yMat # return参数returnwsplt . RC params[ font . sans-serif ]=[ sim hei ]#用于显示中文标签PLT . RC params[ axes . unicode _ MINUS ]=false #用于显示负号clf1=normal()#拟合原始数据w1=clf1.fit(x,Y)#预测数据y_pred=x * w1[1] w1[0]#拟合新数据w2=clf1.fit(x_1,y_1)#预测数据y_1

  因为几个异常点的数据,新拟合回归线的参数变大了很多,从19点到47点以上;模型的性能会降低,因为它与实际的数据分布相分离。

  我们加入L2正则项来调整模型。下面是L2正则化的损失函数;

  梯度下降法求解岭回归参数。在上一篇文章中,我们都推导了线性回归的梯度和L2正则项的梯度。这个渐变是两者的相加。算了,还是写下来:

  按如下方式编写python代码(即在原始线性回归梯度上加上L2梯度):

  class ridge():def _ _ init _ _(self):pass #梯度下降法迭代训练模型参数,x为特征数据,y为标签数据,a为学习率,epochs为迭代次数,Lambda为正则参数def fit(self,x,y,a,epochs,Lambda): #计算数据总量m=x.shape[0] #添加偏移项x=np.concatenate ((np.ones ((m,1)),x),axis=1) #计算特征总数n=X.shape[1] #初始化并将其转换为矩阵形式W. 1))) #X转换为矩阵形式xMat=np.mat(X) #y转换为矩阵形式。 这一步很重要,而且如果m X 1 yMat=NP . mat(y . shape(-1,1) #循环epochs times for I in range(epochs):gradient=xmat . t *(xmat * w-yMat)/mlambda * w=w-a * gradient return w def predict(self,X,w): # X这里也应该是有偏的,在训练X是什么维度的数据时,预测也应该保持同样的return np.dot(x,w) ridge()函数来实现我们的实例(以下参数均为本人调试确认使模型收敛,继续增加迭代次数或改变学习速率,最终模型系数不变):

  当Lambda参数为0时,也就是不加L2正则项时,是普通的线性回归,参数输出也是一样的,都是47个点以上。

  #=0;Clf=ridge () w=clf.fit (x _ 1,y _ 1,a=0.001,epochs=10000,lambda=0) print (w) #计算新的拟合值y _ 1 _ pred=x _ 1 * w [1] w [0 Label=样本分布)ax1.plot(x,y_pred,c=原始样本拟合)ax1.plot (x _ 1,y _ 1 _ pred,c= r ,Label=新样本

  当=0.5时,参数变为31点以上;

  #=0.5;Clf=ridge () w=clf.fit (x _ 1,y _ 1,a=0.001,epochs=10000,lambda=0.5) print (w) #计算新的拟合值y _ 1 _ pred=x _ 1 * w [1] w [ Y_1,label=样本分布)ax1.plot(x,y_pred,c=y ,label=原始样本拟合)ax1.plot (x _ 1,y _ 1 _ pred,c= r

  当Lambda=1.5时,参数变为大于18点,与没有离群值的参数基本相同。

  #=1.5;Clf=ridge () w=clf.fit (x _ 1,y _ 1,a=0.001,epochs=10000,lambda=1.5) print (w) #计算新的拟合值y _ 1 _ pred=x _ 1 * w [1] w [ Y_1,label=样本分布)ax1.plot(x,y_pred,c=y ,label=原始样本拟合)ax1.plot (x _ 1,y _ 1 _ pred,c= r

  当=20时,参数大于2点,拟合线几乎是一条水平线。此时存在严重的欠拟合,损失函数值很大,模型完全没有收敛性。

  #=20;Clf=ridge () w=clf.fit (x _ 1,y _ 1,a=0.001,epochs=10000,lambda=20) print (w) #计算新的拟合值y _ 1 _ pred=x _ 1 * w [1] w [0 Label=样本分布)ax1.plot(x,y_pred,c=y ,Label=原始样本拟合)ax1.plot (x _ 1,y _ 1 _ pred,c= r ,label= new

  可以发现,适当的L2正则参数可以防止过拟合;

  当Lambda参数一越来越大,模型参数越来越小,慢慢趋近于0。

  方法二:用标准方程法实现岭回归。接下来我们用标准方程法实现岭回归,推导公式如下:

  Python代码实现如下:

  class standard _ ridge():def _ _ init _ _(self):pass def fit(self,X,y,Lambda):M=X . shape[0]X=NP . concatenate((NP . ones((M,1)),X),Axis=1)xmat=NP . mat(X)ymat=NP . mat(y . shape(-1,1)) xtx=xmat.t * xmat #生成单位矩阵,行列相等时只能加两个矩阵#在前面的梯度下降法代码中,我们没有rxTx=XXNP。eye(xmat . shape[1])* lambda * m # Rxtx . I是Rxtx w=rxTx的逆矩阵。我*圣诞节。T * yMat return w .下面是运行结果:

  基本上结果是一样的,只是这种形式更简洁方便。

  调用sklearn从sklearn.linear _ model导入ridge lr=ridge(alpha=0)lr . fit(x _ 1,y _ 1) print(当alpha=0 ,lr.coef _, n )lr=ridge(alpha=40)lr . fit(Y _ 1)print( alpha=40 ,lr.coef_, n) lr=ridge (alpha=150) lr。fit (x _ 1,y _ 1) print (alpha=150 ,lr。系数_,

  Sklearn显示山脊:

  1.随着值的增大,也就是正则项的系数增大,系数越来越接近0,但是没有什么等于0。

  # Show data=sk learn . datasets . load _ Boston()x=data[ data ]y=data[ target ]LR=Ridge(alpha=0)LR . fit(x,y) print (when alpha=0 ,lr.coef _,)N) LR=Ridge (alpha=10) LR。Fit (x,y) Print (alpha=10 ,lr.coef_, n) LR=Ridge (alpha=100) LR。拟合(x,y)打印( alpha=10)

  总结:线性回归系列到此结束。因为很多概念都是第一次讲,所以写得很仔细,辅以数据实例,保证读者能看懂,同时也可以手动重现。这些基本概念说清楚了,也方便后面解释复杂的算法。

  接下来,介绍逻辑回归。

基于knn的手写数字识别代码,基于knn算法的手写识别毕业论文