``````

import math
import pandas as pd
import numpy as np
import random
import time

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 = 100000             # 最大迭代次数
self.weight_lambda = 0.01               # 衰退权重

def cal_e(self,x,l):
'''
计算博客中的公式3
'''

theta_l = self.w[l]
product = np.dot(theta_l,x)

return math.exp(product)

def cal_probability(self,x,j):
'''
计算博客中的公式2
'''

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):
'''
计算博客中的公式1
'''

first = int(y==j)                           # 计算示性函数
second = self.cal_probability(x,j)          # 计算后面那个概率

return -x*(first-second) + self.weight_lambda*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__':

time_1 = time.time()

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=23323)
# print train_features.shape
# print train_features.shape

time_2 = time.time()
print('read data cost '+ str(time_2 - time_1)+' second')

print('Start training')
p = Softmax()
p.train(train_features, train_labels)

time_3 = time.time()
print('training cost '+ str(time_3 - time_2)+' second')

print('Start predicting')
test_predict = p.predict(test_features)
time_4 = time.time()
print('predicting cost ' + str(time_4 - time_3) +' second')

score = accuracy_score(test_labels, test_predict)
print("The accruacy socre is " + str(score))
``````

1个回答

tensorflow载入训练好的模型进行预测，同一张图片预测的结果却不一样？？？？

python如何自定义权重损失函数？

python深度学习分类后的 混淆矩阵的显示方式为什么不是单纯的一个矩阵

python深度学习分类后的 混淆矩阵的意义

LSTM神经网络预测值与实际值偏差过大

bp神经网络不能正常分类
``` import numpy as np import sklearn from sklearn import datasets from matplotlib import pyplot as plt class Config: eta=0.003#学习率 input_dim=2#输入层神经元个数，即样本的特征数，这里是横纵坐标 hidden_dim=3#隐层神经元个数 output_dim=2#输出层神经元个数，分别代表P(y=0)与P(y=1)，取较大者为数据点的分类 N=200#训练集样本数 def generate_data(): np.random.seed(0) X,Y=sklearn.datasets.make_moons(Config.N,noise=0.20)#大小为N的二分类非线性可分数据集 return X,Y def softmax(z):#输出层softmax函数，输出为yhat。为了数值稳定防止溢出，进行平移。 z-=np.max(z) return np.exp(z)/np.sum(np.exp(z)) def predict(x,model): ''' 得到预测输出 ''' p=np.dot(x,model['v'])+model['b']#隐层输入 a=np.tanh(p)#隐层输出 z=np.dot(a,model['w'])+model['c']#输出层输入 yhat=softmax(z)#输出层输出(概率) return np.argmax(yhat,axis=1),yhat#选概率大的作为分类 def CrossEntropyLoss(y,yhat):#单个样本交叉熵损失函数 return -np.sum(y*np.log(yhat)) def totalLoss(X,Y,model):#训练集总损失 Loss=0.0 for i in range(len(X)): ypred,yhat=predict(X[i],model) Loss+=CrossEntropyLoss(Y[i],yhat) return Loss/len(X) def build_model(X,Y,iters): ''' 在[0,1)区间内随机初始化连接权重与阈值 ''' v=np.random.random((Config.input_dim,Config.hidden_dim))#输入层到隐层的连接权重 w=np.random.random((Config.hidden_dim,Config.output_dim))#隐层到输出层的连接权重 b=np.random.random((1,Config.hidden_dim))#隐层的阈值 c=np.random.random((1,Config.output_dim))#输出层的阈值 model={} for t in range(iters): for i in range(len(X)):#一个训练样本就更新一次参数 #forward propagation p=np.dot(X[i],v)+b#隐层输入 a=np.tanh(p)#隐层输出 z=np.dot(a,w)+c#输出层输入 yhat=softmax(z)#输出层输出(概率) #back propagation g=yhat-Y[i]#输出层梯度 w+=-Config.eta*np.dot(a.transpose(),g)#更新隐层到输出层的连接权重 c+=-Config.eta*g#更新输出层的阈值 h=np.dot(g,w.transpose())*(1-np.power(a,2))#隐层梯度 v+=-Config.eta*np.dot(np.array([X[i]]).transpose(),h)#更新输入层到隐层的连接权重 b+=-Config.eta*h#更新隐层的阈值 model={'v': v, 'w': w, 'b': b, 'c': c} if(t%100==0): print "after",t,"iteration:",totalLoss(X,Y,model) return model def plot_decision_boundary(pred_func,X,Y): #设置最小最大值, 加上一点外边界 x_min,x_max=X[:,0].min()-.5,X[:,0].max()+.5 y_min,y_max=X[:,1].min()-.5,X[:,1].max()+.5 h=0.01 # 根据最小最大值和一个网格距离生成整个网格 xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h)) # 对整个网格预测边界值 Z,Yhat=pred_func(np.c_[xx.ravel(),yy.ravel()]) Z=Z.reshape(xx.shape) # 绘制边界和数据集的点 plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral) plt.scatter(X[:,0],X[:,1],c=Y,cmap=plt.cm.Spectral) def NN(): X,Y=generate_data()#产生数据集 model=build_model(X,Y,1500)#建立神经网络模型,iters为迭代次数 plot_decision_boundary(lambda x: predict(x,model),X,Y) plt.title("Decision Boundary for hidden layer size %d" %Config.hidden_dim) plt.show() if __name__ == "__main__": NN() ``` 求解！！

20道你必须要背会的微服务面试题，面试一定会被问到

Windows可谓是大多数人的生产力工具，集娱乐办公于一体，虽然在程序员这个群体中都说苹果是信仰，但是大部分不都是从Windows过来的，而且现在依然有很多的程序员用Windows。 所以，今天我就把我私藏的Windows必装的软件分享给大家，如果有一个你没有用过甚至没有听过，那你就赚了????，这可都是提升你幸福感的高效率生产力工具哦！ 走起！???? NO、1 ScreenToGif 屏幕，摄像头和白板...

2020 年，大火的 Python 和 JavaScript 是否会被取而代之？
Python 和 JavaScript 是目前最火的两大编程语言，但是2020 年，什么编程语言将会取而代之呢？ 作者 |Richard Kenneth Eng 译者 |明明如月，责编 | 郭芮 出品 | CSDN（ID：CSDNnews） 以下为译文： Python 和 JavaScript 是目前最火的两大编程语言。然而，他们不可能永远屹立不倒。最终，必将像其他编程语言一...

AI 没让人类失业，搞 AI 的人先失业了

2020年，冯唐49岁：我给20、30岁IT职场年轻人的建议

B站是个宝，谁用谁知道???? 作为一名大学生，你必须掌握的一项能力就是自学能力，很多看起来很牛X的人，你可以了解下，人家私底下一定是花大量的时间自学的，你可能会说，我也想学习啊，可是嘞，该学习啥嘞，不怕告诉你，互联网时代，最不缺的就是学习资源，最宝贵的是啥？ 你可能会说是时间，不，不是时间，而是你的注意力，懂了吧！ 那么，你说学习资源多，我咋不知道，那今天我就告诉你一个你必须知道的学习的地方，人称...

【蘑菇街技术部年会】程序员与女神共舞，鼻血再次没止住。（文末内推）

Java校招入职华为，半年后我跑路了

Python全栈 Linux基础之3.Linux常用命令
Linux对文件（包括目录）有很多常用命令，可以加快开发效率：ls是列出当前目录下的文件列表，选项有-a、-l、-h，还可以使用通配符；c功能是跳转目录，可以使用相对路径和绝对路径；mkdir命令创建一个新的目录，有-p选项，rm删除文件或目录，有-f、-r选项；cp用于复制文件，有-i、-r选项，tree命令可以将目录结构显示出来（树状显示），有-d选项，mv用来移动文件/目录，有-i选项；cat查看文件内容，more分屏显示文件内容，grep搜索内容；>、>>将执行结果重定向到一个文件；|用于管道输出。
​两年前不知如何编写代码的我，现在是一名人工智能工程师

Python实战：抓肺炎疫情实时数据，画2019-nCoV疫情地图

loonggg读完需要5分钟速读仅需 2 分钟大家好，我是你们的校长。我知道大家在家里都憋坏了，大家可能相对于封闭在家里“坐月子”，更希望能够早日上班。今天我带着大家换个思路来聊一个问题...

C++内存管理（面试版）
C++的内存管理 一、C++内存管理详解 1、内存的分配方式 (a)(a)(a)栈：编译器分配的内存，用来存储函数的局部变量，函数调用结束后则自动释放内存。 (b)(b)(b)堆：程序员用new分配的内存，一般存储指针；如果程序运行结束的时候没有被释放，则操作系统会自动回收。 (c)(c)(c)自由存储区：程序员用malloc分配的内存，使用free来释放内存。 (d)(d)(d)全局/静态存储区
Spring框架|JdbcTemplate介绍

B 站上有哪些很好的学习资源?