1.导入测试数据
from sklearn.datasets import load_digits
import numpy as np
import matplotlib.pyplot as plt
digits = load_digits()
print(digits.data.shape)
print(digits.target.shape)
print(digits.images.shape)
digits = load_digits()
digits.images[0]
X=[]
plt.matshow(digits.images[0])
plt.show()
for i in range(len(digits.images)):
X.append(digits.images[i].reshape(1,64)[0])
X=np.array(X)
data=np.concatenate((X,digits.target.reshape(len(digits.target),1)),axis=1)
2.打乱数据,分成训练集和测试集
np.random.shuffle(data)
train_data_x=data[:1500,0:64]
train_data_y=data[:1500,-1]
test_data_x=data[1500:,0:64]
test_data_y=data[1500:,-1]
train_data_x.shape,train_data_x[5],train_data_y[6]
3. 初始化参数
#初始化参数W
W=np.random.rand(10,64,)
#初始化偏置
b=np.random.rand(10,1)
W,b
4.softmax 函数
#功能函数
#我们要的是exp(1)/(exp(1)+exp(2)+...) ,exp(2)/(exp(1)+exp(2)+...) 向量可以这么写
def softmax(z):
return np.exp(z)/np.sum(np.exp(z))#这个如果数据是二维的就不能用了,因为会把所有行的值都加起来,我们只
#需要每一行的总和
#数组的话2行乘三列的,会把所有的元素求和,我们只需要每行求和用下面这个softmax函数
#z=WX+b 是一个4个z值,因为有四类,求四组w,,X是(300,2) W(4,2) 相乘应该是300*4
#通过softmax 每行四个值的exp分别与四个exp的和做比值,得到四个概率值为四个类的概率
def softmax2(z):
exp=np.exp(z)
sum=np.sum(np.exp(z),axis=1,keepdims=True)#在第二个维度上求和,并且保持维度不变
return exp/sum
print(softmax2(np.dot(train_data_x,W.T)+b.T))
np.sum(softmax2(np.dot(train_data_x,W.T)+b.T),axis=1)
5.one_hot 编码
#one_hot 编码,把四个类的标签,假如是[1,2,3,4]类,变成[1,0,0,0]代表1类,[0,1,0,0]代表2类....以此类推
def one_hot(temp):
one_hot=np.zeros((len(temp),len(np.unique(temp))))
one_hot[np.arange(len(temp)),(temp.astype(np.int))]=1
return one_hot
one_hot(train_data_y).shape
6.计算y=WX+b
#计算y=WX+b
def computer_hat(W,X,b):
return np.dot(X,W.T)+b.T
W.shape,train_data_x.shape,b.shape,computer_hat(W,train_data_x,b)
7.计算损失函数
#计算损失函数
def cross_entropy(y,y_hat):
loss=-(1/len(y))*np.sum(y*np.log(y_hat))
return loss
8.计算梯度,获得最优W和b
lr=0.001
All_loss=[]
for i in range(1000):
X=train_data_x
Z=computer_hat(W,X,b)#z=Wx+b
y=one_hot(train_data_y)
y_hat=softmax2(Z)
loss=cross_entropy(y,y_hat)
All_loss.append(loss)
#计算梯度
gw=(1/len(X))*np.dot(X.T,(y_hat-y))
gb=(1/len(X))*np.sum(y_hat-y)
W=W-lr*gw.T
b=b-lr*gb
if i%100==0:
print(loss)
plt.plot(All_loss)
plt.show()
9.测试模型
def predict(W,X,b):
Z=computer_hat(W,X,b)
y_hot=softmax2(Z)
return np.argmax(y_hot,axis=1)
#计算正确率
np.sum(predict(W,test_data_x,b)==test_data_y)/len(test_data_y)
正确率大概0.7到0.8之间