技术标签: Mechine learning PYTHON
代码和算例可以到博主github中下载:
https://github.com/Airuio/Implementing-the-method-of-gradient-descent-by-using-Python-
上一篇讲解了最原始的感知机算法,该算法的目的只为收敛,得到的往往不是基于样本的最佳解,梯度下降法以最小化损失函数为目标,得到的解比原始感知机算法一般更准确。
梯度下降法算法原理如下图所示:
基于以上原理来对权重系数和闵值进行更新即可得到最后的解。
原理实现可按如下代码操作:
#实现梯度下降法:
import numpy as np
class AdalineGD(object):
def __init__(self,eta=0.01,n_iter=50): #定义超参数学习率和迭代次数
self.eta = eta
self.n_iter = n_iter
def fit(self,X,y): #定义权重系数w和损失函数cost
self.w_ = np.zeros(1+X.shape[1])
self.cost_ = []
for i in range(self.n_iter): #更新权重
output = self.net_input(X) #计算预测值
errors = (y - output) #统计误差
self.w_[1:] += self.eta*X.T.dot(errors)
self.w_[0] += self.eta * errors.sum()
cost = (errors**2).sum()/2.0 #损失函数
self.cost_.append(cost)
return self
def net_input(self,X):
return np.dot(X,self.w_[1:]) + self.w_[0]
def activation(self,X):
return self.net_input(X)
def predict(self, X):
return np.where(self.activation(X) >= 0.0, 1, -1)
以上算法即实现了梯度下降法更新权重参数。将该模块命名为Adaline_achieve,基于鸢尾花lirs数据集,我们进行算例的验证如下所示:
from Adaline_achieve import AdalineGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
df = pd.read_excel(io = 'lris.xlsx',header = None) #读取数据为Dataframe结构,没有表头行
y = df.iloc[0:100,4].values #取前100列数据,4列为标识
y = np.where(y == 'Iris-setosa', -1,1)
X = df.iloc[0:100,[0,2]].values #iloc为选取表格区域,此处取二维特征进行分类,values为返回不含索引的表
plt.scatter(X[:50,0],X[0:50,1],color = 'red',marker = 'o', label = 'setosa')
plt.scatter(X[50:100,0],X[50:100,1],color = 'blue',marker = 'x', label = 'versicolor')
plt.xlabel('petal lenth')
plt.ylabel('sepal lenth')
plt.legend(loc = 2) #画出标签以及标签的位置参数
plt.show() #出图
#以上六行与分类无关,仅仅是为了直观的感受两块数据的分布区域
fig,ax = plt.subplots(nrows = 1 , ncols = 2, figsize = (8,4))
'''
完成不同学习率下的分类的任务,进行结果展示
plt.subplots(nrows = 1 , ncols = 2, figsize = (8,4)中nrows表示几行图,ncols表示几列
figsize为图片大小。
'''
ada1 = AdalineGD(eta = 0.01,n_iter = 10).fit(X,y)
ax[0].plot(range(1,len(ada1.cost_) + 1), np.log10(ada1.cost_) , marker = 'o')
ax[0].set_xlabel('Epoches')
ax[0].set_ylabel('log(ada1.cost_)')
ax[0].set_title('Adaline - Learning rate 0.01')
ada2 = AdalineGD(eta = 0.0001,n_iter = 10).fit(X,y)
ax[1].plot(range(1,len(ada2.cost_) + 1), ada2.cost_ , marker = 'o')
ax[1].set_xlabel('Epoches')
ax[1].set_ylabel('ada1.cost_')
ax[1].set_title('Adaline - Learning rate 0.01')
plt.show()
'''
由以上得到的结果图可以看出,学习率过大会导致不收敛,过小会导致收敛速度慢
采用数据标准化、归一化的方法可以使得梯度下降法取得更好的效果
对同维度处的样本特征取均值和标准差,标准化后的值等于:
(原值-均值)/标准差,可以用numpy中的mean和std方法便捷的获得
'''
X_std = np.copy(X) #将样本特征归一化、标准化
X_std[:,0] = (X[:,0] - X[:,0].mean()) / X[:,0].std()
X_std[:,1] = (X[:,1] - X[:,1].mean()) / X[:,1].std()
ada = AdalineGD(eta = 0.01, n_iter = 15)
ada.fit(X_std,y)
def plot_decision_region(X,y,classifier,resolution = 0.02):
markers = ('s','x','o','~','v')
colors = ('red','blue','lightgreen','gray','cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
#画出界面
x1_min, x1max = X[:,0].min() - 1, X[:,0].max() + 1
x2_min, x2max = X[:,1].min() - 1, X[:,1].max() + 1
xx1,xx2 = np.meshgrid(np.arange(x1_min,x1max,resolution),
np.arange(x2_min,x2max,resolution)) #生成均匀网格点,
'''
meshgrid的作用是根据传入的两个一维数组参数生成两个数组元素的列表。如果第一个参数是xarray, 维度是xdimesion,第二个参数是yarray,维度是ydimesion。那么生成的第一个二维数组是以xarray为行,ydimesion行的向量;而第二个二维数组是以yarray的转置为列,xdimesion列的向量。
'''
Z = classifier.predict(X = np.array([xx1.ravel(),xx2.ravel()]).T)plt.show()
结果如下图所示:
前言:想安装个英语单词比较的工具,将字母排列相似的单词放在一起。先试了PYTHON自带的difflib,结果不是太理想,设置大于等于80%的相似度:ratio=difflib.SequenceMatcher(None, new_word, sheet1.cell(i,2).value).quick_ratio() if ratio>=0.8: findwords+='相似:'+sheet1.cell(i,2).value+'\t\n'结..._levenshtein 安装
不到三个月,我在CSDN的第一个一万_csdn阅读量多少算高
是非人生 — 一个菜鸟程序员的5年职场路第21节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml日期:2008-4-9 1:41:25 30 ——临危受命 “我很看好你,你要表现给我看,拿出你跟别人不一样的东西来。你们一起来了那么多人,还没转正就能做特性负责人的..._是非人生
ObjectSpace.define_finalizer 方法可以接受一个 proc, 当某个对象被 GC 销毁时会回调该 proc. 当我按照文档使用这个方法的时候却发现一个很奇怪的现象, 测试代码如下:def foo str = 'hello, world' * 1_000_000 ObjectSpace.define_finalizer(str, proc { |id|_ruby finalize
问题分析:将分子分母分开来看,分子依次是2,3,5,8,13,21,除开第一项和第二项之外,其他的每一项都与前两项有直接的关系(前两项求和),所以明显是递归算法的特征,分母也是一样,所以该题通过递归方法求解。详细编码:package test;/** * 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。..._编写一个分子2,3分母1,2相除然后再相加
pycuda安装: (1)查看CUDA版本:cat /usr/local/cuda/version.txt (目前实验CUDA版本为:CUDA Version 9.0.176) (2)查看cudnn版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 (目前实验cudnn版本:7.0) ..._pycuda
<!DOCTYPE html><html><head> <title>select</title> <style> .submenu >div{ display: none; } .submenu:hover >div{
计算梯度的三种方法: 数值法,解析法,反向传播法_梯度数值计算
深圳技术大学2020录取分数线是多少,各专业录取分数线是多少,是每个填报深圳技术大学的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被深圳技术大学的录取,一品高考网整理相关信息供参考,希望对大家有帮助1,2020年分数线2020年深圳技术大学的录取分数线已经公布,欢迎收藏本页面。首次招收文科生、艺术生,其中艺术类录取分列全省第十一位。2020年,深技大首次招收文科生、艺术生。物..._广东省排名多少能上深大计算机专业
继上一章apriori关联分析算法 [https://blog.csdn.net/weixin_37825814/article/details/113801865], (https://blog.csdn.net/weixin_37825814/article/details/113801865)本文讲解FP-Growth(Frequent Pattern Growth)算法根据上一章的 Apriori 计算过程,我们可以知道 Apriori 计算的过程中,会使用排列组合的方式列举出所有可能的项集,每_python的pyfpgrowth.find_frequent_patterns有什么用
一、新建一个demo.xml的文件: 放学后 cmirssd 2010 25 你的孤独,虽败犹荣 刘同 2011 30 使用DOM的准备工作:1、创建DocumentBuilderFactory对象(newInstance方法)2、创建DocumentBuilder对象(ne
题面Description我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树。对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为111的结点是叶子结点;对于任一点权大于111的结点uuu,uuu的孩子数目degudegudeg_u属于集合DDD,且uuu的点权等于这些孩子结点的点权之和。给出一个整数sss,你能求出根节点权值为sss的神犇...