Python: Soft_max 分类器

我们能够建立例如以下的loss function:

Li=?log(pyi)=?log??efyi∑jefj??

L=1N∑iLi+12λ∑k∑lW2k,l

以下我们推导loss对W,b的偏导数,我们能够先计算loss对f的偏导数,利用链式法则。我们能够得到:

?Li?fk=?Li?pk?pk?fk?pi?fk=pi(1?pk)i=k?pi?fk=?pipki≠k?Li?fk=?1pyi?pyi?fk=(pk?1{yi=k})

进一步,由f=XW+b,可知?f?W=XT,?f?b=1,我们能够得到:

ΔW=?L?W=1N?Li?W+λW=1N?Li?p?p?f?f?W+λWΔb=?L?b=1N?Li?b=1N?Li?p?p?f?f?bW=W?αΔWb=b?αΔb

以下是用Python实现的soft max 分类器,基于Python 2.7.9, numpy, matplotlib.

代码来源于斯坦福大学的课程: http://cs231n.github.io/neural-networks-case-study/

基本是照搬过来,通过这个程序有助于了解python的语法。

import numpy as np
import matplotlib.pyplot as plt

N = 100  # number of points per class
D = 2    # dimensionality
K = 3    # number of classes
X = np.zeros((N*K,D))    #data matrix (each row = single example)
y = np.zeros(N*K, dtype=‘uint8‘)  # class labels

for j in xrange(K):
  ix = range(N*j,N*(j+1))
  r = np.linspace(0.0,1,N)            # radius
  t = np.linspace(j*4,(j+1)*4,N) + np.random.randn(N)*0.2 # theta
  X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
  y[ix] = j

# print y

# lets visualize the data:
plt.scatter(X[:,0], X[:,1], s=40, c=y, alpha=0.5)
plt.show()
#Train a Linear Classifier

# initialize parameters randomly
W = 0.01 * np.random.randn(D,K)
b = np.zeros((1,K))

# some hyperparameters
step_size = 1e-0
reg = 1e-3 # regularization strength

# gradient descent loop
num_examples = X.shape[0]

for i in xrange(200):

  # evaluate class scores, [N x K]
  scores = np.dot(X, W) + b 

  # compute the class probabilities
  exp_scores = np.exp(scores)
  probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]

  # compute the loss: average cross-entropy loss and regularization
  corect_logprobs = -np.log(probs[range(num_examples),y])
  data_loss = np.sum(corect_logprobs)/num_examples
  reg_loss = 0.5*reg*np.sum(W*W)
  loss = data_loss + reg_loss
  if i % 10 == 0:
    print "iteration %d: loss %f" % (i, loss)

  # compute the gradient on scores
  dscores = probs
  dscores[range(num_examples),y] -= 1
  dscores /= num_examples

  # backpropate the gradient to the parameters (W,b)
  dW = np.dot(X.T, dscores)
  db = np.sum(dscores, axis=0, keepdims=True)

  dW += reg*W     #regularization gradient

  # perform a parameter update
  W += -step_size * dW
  b += -step_size * db

# evaluate training set accuracy
scores = np.dot(X, W) + b
predicted_class = np.argmax(scores, axis=1)
print ‘training accuracy: %.2f‘ % (np.mean(predicted_class == y))

生成的随机数据

执行结果

时间: 2024-10-12 12:02:56

Python: Soft_max 分类器的相关文章

机器学习之路:python线性回归分类器 进行良恶性肿瘤分类预测

使用python3 学习了线性回归的api 分别使用逻辑斯蒂回归  和   随机参数估计回归 对良恶性肿瘤进行预测 我把数据集下载到了本地,可以来我的git下载源代码和数据集:https://github.com/linyi0604/kaggle 1 import numpy as np 2 import pandas as pd 3 from sklearn.cross_validation import train_test_split 4 from sklearn.preprocessin

机器学习之路:python 综合分类器 随机森林分类 梯度提升决策树分类 泰坦尼克号幸存者

python3 学习使用随机森林分类器 梯度提升决策树分类 的api,并将他们和单一决策树预测结果做出对比 附上我的git,欢迎大家来参考我其他分类器的代码: https://github.com/linyi0604/MachineLearning 1 import pandas as pd 2 from sklearn.cross_validation import train_test_split 3 from sklearn.feature_extraction import DictVe

Python图像处理(15):SVM分类器

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在opencv中支持SVM分类器,本文尝试在python中调用它. 和前面的贝叶斯分类器一样,SVM也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类. 首先也是先创建训练用的数据,需要注意的是这里的train_label必须是整数类型,而不是float: # 训练的点数 train_pts = 30 # 创建测试的数据点,2类 # 以(-1.5, -1

Python图像处理(14):神经网络分类器

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在opencv中支持神经网络分类器,本文尝试在python中调用它. 和前面的贝叶斯分类器一样,神经网络也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类. 首先也是先创建训练用的数据: # 训练的点数 train_pts = 30 # 创建测试的数据点,2类 # 以(-1.5, -1.5)为中心 rand1 = np.ones((train_pts,2

Python实现K近邻算法<KNN>_分类器

收集数据 数据来源:http://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival 文本数据如下图所示: 31,65,4,1 33,58,10,1 33,60,0,1 34,59,0,2 34,66,9,2 这是关于乳腺癌已手术患者存活时间(寿命)的样本集,文本文件中共包含306个样本,样本包含的属性有: 1. 患者做手术时的年龄 opAge 2. 患者做手术的年份-1900 opYear,比如1970年做的手术,则opYear属性的值为

机器学习经典算法详解及Python实现--基于SMO的SVM分类器

原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector machine,简称SVM.通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解. (一)理解SVM基本原理 1,SVM的本质--分类 给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些

Fisher准则线性分类器的Python实现

Fisher准则线性分类器的Python实现 Fisher准则线性分类器的Python实现 选取的训练集与测试集 分类决策与分类器 代码 测试集上的结果 本节内容:本节内容是根据上学期所上的模式识别课程的作业整理而来,第二道题目是线性分类器设计,数据集是Iris(鸢尾花的数据集),根据前一题的Kmeans聚类得出的结果,分成训练集与测试集,进行比较. 选取的训练集与测试集 训练集:(选取上一题中的第一种结果:每一类大小都是l=0.67*len(dataset[i]),前l个数据) 第一类(33个

机器学习经典算法详解及Python实现---Logistic回归(LR)分类器

(一)认识Logistic回归(LR)分类器 首先,Logistic回归虽然名字里带"回归",但是它实际上是一种分类方法,主要用于两分类问题,利用Logistic函数(或称为Sigmoid函数),自变量取值范围为(-INF, INF),自变量的取值范围为(0,1),函数形式为: 由于sigmoid函数的定义域是(-INF, +INF),而值域为(0, 1).因此最基本的LR分类器适合于对两分类(类0,类1)目标进行分类.Sigmoid 函数是个很漂亮的"S"形,如下

机器学习之路: python k近邻分类器 鸢尾花分类预测

使用python语言 学习k近邻分类器的api 欢迎来到我的git查看源代码: https://github.com/linyi0604/kaggle 1 from sklearn.datasets import load_iris 2 from sklearn.cross_validation import train_test_split 3 from sklearn.preprocessing import StandardScaler 4 from sklearn.neighbors i