用线性单分逻辑回归分析肿瘤是良性的还是恶性的

一 实例描述
假设某肿瘤医院想用神经网络对已有的病例数据进行分类,数据的样本特征包括病人的年龄和肿瘤的大小,对应的标签是该病例是良性肿瘤还是恶性肿瘤。

二 代码
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from sklearn.utils import shuffle
#生成样本集   
'''
为了方便演示,先用Python生成一些模拟数据来代替样本,它是个二维数据“病人的年纪,肿瘤的大小”。
generate为生成模拟样本的函数,意思是按照指定的均值和方差生成固定数量的样本
'''
def generate(sample_size, mean, cov, diff,regression):   
    num_classes = 2 #len(diff)
    samples_per_class = int(sample_size/2)
    X0 = np.random.multivariate_normal(mean, cov, samples_per_class)
    Y0 = np.zeros(samples_per_class)
    
    for ci, d in enumerate(diff):
        X1 = np.random.multivariate_normal(mean+d, cov, samples_per_class)
        Y1 = (ci+1)*np.ones(samples_per_class)
    
        X0 = np.concatenate((X0,X1))
        Y0 = np.concatenate((Y0,Y1))
        
    if regression==False: #one-hot  0 into the vector "1 0
        class_ind = [Y==class_number for class_number in range(num_classes)]
        Y = np.asarray(np.hstack(class_ind), dtype=np.float32)
    X, Y = shuffle(X0, Y0)
    
    return X,Y    
'''
下面的代码调用generate函数生成1000个数据,并将它们图示化。
定义随机数的种子值10(这样可以保证每次运行代码时生成随机值都一样)
定义生成类的个数num_classes =2
generate中的3.0是表明两类数据的x和y差距3.0。传入的最后一个参数regression=True表明使用非one-hot的编码标签
'''
input_dim = 2                    
np.random.seed(10)
num_classes =2
mean = np.random.randn(num_classes)
cov = np.eye(num_classes)
X, Y = generate(1000, mean, cov, [3.0],True)
colors = ['r' if l == 0 else 'b' for l in Y[:]]
#取X的第一列和X的第2列作为横轴和纵轴画图
plt.scatter(X[:,0], X[:,1], c=colors)
plt.xlabel("Scaled age (in yrs)")
plt.ylabel("Tumor size (in cm)")
plt.show()
lab_dim = 1
# 构建网络模型
'''
先定义输入和输出两个占位符,然后是w和b的权重。
激活函数使用sigmoid
损失函数loss仍然使用交叉熵,里面又加了一个平方差函数,用来评估模型的错误率。
优化器使用AdamOptimizer
'''
input_features = tf.placeholder(tf.float32, [None, input_dim])
input_lables = tf.placeholder(tf.float32, [None, lab_dim])
# Set model weights
W = tf.Variable(tf.random_normal([input_dim,lab_dim]), name="weight")
b = tf.Variable(tf.zeros([lab_dim]), name="bias")
output =tf.nn.sigmoid( tf.matmul(input_features, W) + b)
cross_entropy = -(input_lables * tf.log(output) + (1 - input_lables) * tf.log(1 - output))
ser= tf.square(input_lables - output)
loss = tf.reduce_mean(cross_entropy)
err = tf.reduce_mean(ser)
optimizer = tf.train.AdamOptimizer(0.04) #尽量用这个--收敛快,会动态调节梯度
train = optimizer.minimize(loss)  # let the optimizer train
'''
设置参数进行训练
令整个数据集迭代50次,每次的minibatchSize取25条
'''
maxEpochs = 50
minibatchSize = 25
# 启动session
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(maxEpochs):
        sumerr=0
        for i in range(np.int32(len(Y)/minibatchSize)):
            x1 = X[i*minibatchSize:(i+1)*minibatchSize,:]
            y1 = np.reshape(Y[i*minibatchSize:(i+1)*minibatchSize],[-1,1])
            tf.reshape(y1,[-1,1])
            _,lossval, outputval,errval = sess.run([train,loss,output,err], feed_dict={input_features: x1, input_lables:y1})
            #每一次计算都将err错误值累加起来,数据集迭代完一次会将err的错误率进行一次平均,平均值再输出来。
            sumerr =sumerr+errval
        print ("Epoch:", '%04d' % (epoch+1), "cost=","{:.9f}".format(lossval),"err=",sumerr/minibatchSize)
        
#数据可视化
    train_X, train_Y = generate(100, mean, cov, [3.0],True)
    colors = ['r' if l == 0 else 'b' for l in train_Y[:]]
    plt.scatter(train_X[:,0], train_X[:,1], c=colors)
    #plt.scatter(train_X[:, 0], train_X[:, 1], c=train_Y)
    #plt.colorbar()
#    x1w1+x2*w2+b=0
#    x2=-x1* w1/w2-b/w2
    x = np.linspace(-1,8,200)
    y=-x*(sess.run(W)[0]/sess.run(W)[1])-sess.run(b)/sess.run(W)[1]
    plt.plot(x,y, label='Fitted line')
    plt.legend()
    plt.show()
三 运行结果
......
Epoch: 0040 cost= 0.029886801 err= 0.0195224161923
Epoch: 0041 cost= 0.029438809 err= 0.0194601739658
Epoch: 0042 cost= 0.029010553 err= 0.0194023399852
Epoch: 0043 cost= 0.028600777 err= 0.0193485640991
Epoch: 0044 cost= 0.028208304 err= 0.0192984981302
Epoch: 0045 cost= 0.027831957 err= 0.0192518597795
Epoch: 0046 cost= 0.027470892 err= 0.0192083755907
Epoch: 0047 cost= 0.027124075 err= 0.0191678027652
Epoch: 0048 cost= 0.026790740 err= 0.0191299224313
Epoch: 0049 cost= 0.026470043 err= 0.0190945206393
Epoch: 0050 cost= 0.026161278 err= 0.0190614254307
四 说明
可以用直线分割的方式解决问题,则可以说这个问题是线性可分的。同理,类似这样的数据集就可以被称为线性可分数据集。凡是用这种方法来解决的问题就叫做线性问题。

五 参考
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值