TensorFlow实现简单线性分类问题

TensorFlow实现简单线性分类问题

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.utils import shuffle

#数据生成和数据处理
def generate(sample_size,mean,cov,diff,regression,num_classes):
    """sample_size:样本个数;mean:不同特征的分布均值;cov:不同特征的分布方差;diff:特征分布的偏移量;regression:是否One Hot;num_classes:分类个数。"""
    sample_size_per_class=int(sample_size//num_classes)
    X0=np.random.multivariate_normal(mean,cov,sample_size_per_class)
    Y0=np.zeros(sample_size_per_class)
    for ci, d in enumerate(diff):
        Xtmp=np.random.multivariate_normal(mean+d,cov,sample_size_per_class)
        Ytmp=(ci+1)*np.ones(sample_size_per_class)
        X0=np.concatenate((X0,Xtmp))
        Y0=np.concatenate((Y0,Ytmp))
    if regression==False:
        class_ind=[Y==class_number for class_number in range(num_classes)]
        Y0=np.asarray(class_ind)
    X,Y=shuffle(X0,Y0)
    return X,Y

np.random.seed(10)
num_classes=2
input_lable=2
mean=np.random.randn(input_lable)
cov=np.eye(input_lable)
X,Y=generate(1000,mean,cov,[3.0],True,num_classes)

lab_dim=1
#参数输入接口
input_featrues=tf.placeholder(tf.float32,[None,input_lable])
input_labels=tf.placeholder(tf.float32,[None,lab_dim])
#变量名
W=tf.Variable(tf.random_normal([input_lable,lab_dim]),name='Weight')
b=tf.Variable(tf.zeros([lab_dim]),name='bias')
output=tf.nn.sigmoid(tf.matmul(input_featrues,W)+b)

cross_entropy=-(input_labels*tf.log(output)+(1-input_labels)*tf.log(1-output))
ser=tf.square(output-input_labels)
loss=tf.reduce_mean(cross_entropy)
err=tf.reduce_mean(ser)

learning_rate=0.04
train=tf.train.AdamOptimizer(learning_rate).minimize(loss)

maxEpochs=60
minibatchSize=25
W_output=[]
b_output=[]
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(maxEpochs):
        sumerr=0
        for i in range(int(len(Y)//minibatchSize)):
            x1=X[i*minibatchSize:(i+1)*minibatchSize:]
            y1=Y[i*minibatchSize:(i+1)*minibatchSize].reshape(-1,1)
            _,lossval,outputval,errval=sess.run([train,loss,output,err],feed_dict={input_featrues:x1,input_labels:y1})
            sumerr+=errval
        if (epoch+1)%10==0:
            print("Epoch:",'%04d'%(epoch+1),"cost=","{:9f}".format(lossval),\
                 "err=",sumerr/minibatchSize)
    print("Finish!")
    W_output.append(sess.run(W))
    b_output.append(sess.run(b))

colors=['r' if l==0 else 'b' for l in Y[:]]
plt.scatter(X[:,0],[X[:,1]],c=colors)
x=np.linspace(-1,8,200)
y=-x*(W_output[0][0]/W_output[0][1])-b_output[0][0]/W_output[0][1]
plt.plot(x,y,label='Fitted line')
plt.xlabel('Scaled age(in yrs)')
plt.ylabel('Tumor size(in cm)')
plt.show()

运行结果:
在这里插入图片描述
代码参考《深度学习之TensorFlow入门、原理与进阶实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值