softmax(多分类算法)实践
1.训练集规模:
数据(第一行为维度,每个字段的名字):
第二行为具体真是样本数据:第一列是标签,后面是特征(0-9的数字识别)
样本格式(10分类,每个类别的样本数较均匀):
图像:28*28:
softmax代码:
# encoding=utf8
import sys
import math
import pandas as pd
import numpy as np
import random
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
class Softmax(object):
def __init__(self):
self.learning_step = 0.000001 # 学习速率
self.max_iteration = 1000 # 最大迭代次数
self.weight_lambda = 0.01 # 衰退权重
def cal_e(self,x,l):
theta_l = self.w[l]
product = np.dot(theta_l,x)
return math.exp(product)
def cal_probability(self,x,j):
molecule = self.cal_e(x,j)
denominator = sum([self.cal_e(x,i) for i in range(self.k)])
return molecule/denominator
def cal_partial_derivative(self,x,y,j):
first = int(y==j) # 计算示性函数
second = self.cal_probability(x,j) # 计算后面那个概率
#return -x*(first-second)
#return -x*(first-second) + self.weight_lambda*abs(self.w[j])
#return -x*(first-second) + self.weight_lambda*self.w[j]*self.w[j]
return -x*(first-second) + self.weight_lambda*self.w[j]*self.w[j] + self.weight_lambda*abs(self.w[j])
def predict_(self, x):
result = np.dot(self.w,x)
row, column = result.shape
# 找最大值所在的列
_positon = np.argmax(result)
m, n = divmod(_positon, column)
return m
def train(self, features, labels):
self.k = len(set(labels))
self.w = np.zeros((self.k,len(features[0])+1))
time = 0
while time < self.max_iteration:
print('loop %d' % time)
time += 1
index = random.randint(0, len(labels) - 1)
x = features[index]
y = labels[index]
x = list(x)
x.append(1.0)
x = np.array(x)
derivatives = [self.cal_partial_derivative(x,y,j) for j in range(self.k)]
for j in range(self.k):
self.w[j] -= self.learning_step * derivatives[j]
def predict(self,features):
labels = []
for feature in features:
x = list(feature)
x.append(1)
x = np.matrix(x)
x = np.transpose(x)
labels.append(self.predict_(x))
return labels
if __name__ == '__main__':
print('Start read data')
raw_data = pd.read_csv('./train.csv', header=0)
data = raw_data.values
imgs = data[0::, 1::]
labels = data[::, 0]
# 选取 2/3 数据作为训练集, 1/3 数据作为测试集
train_features, test_features, train_labels, test_labels = train_test_split(
imgs, labels, test_size=0.33, random_state=1)
print train_features.shape
print test_features.shape
print('Start training')
p = Softmax()
p.train(train_features, train_labels)
print('Start predicting')
test_predict = p.predict(test_features)
print p.w.shape
#print p.w[0]
score = accuracy_score(test_labels, test_predict)
print("The accruacy socre is " + str(score))
执行:
结果: