softmax(多分类算法)实践

1.训练集规模:

数据(第一行为维度,每个字段的名字):

第二行为具体真是样本数据:第一列是标签,后面是特征(0-9的数字识别)

样本格式(10分类,每个类别的样本数较均匀):

图像:28*28:

softmax代码:

扫描二维码关注公众号,回复: 5724897 查看本文章

# 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))

执行:

结果:

猜你喜欢

转载自blog.csdn.net/qq_28286027/article/details/88415961