線性邏輯回歸python

2021-08-31 03:27:56 字數 3722 閱讀 8899

例項描述

假設腫瘤醫院想要用神經網路對已有的病例資料進行分類,資料的樣本特徵包括病人的年齡和腫瘤的大小,對應的標籤應該是良性腫瘤還是惡性腫瘤

1.生成樣本集

利用python生成乙個二維陣列「病人的年紀,腫瘤的大小」樣本集,下面**中generate為生成樣本的函式,意思是按照指定的均值和方差生成固定數量的樣本。

import numpy as np

import matplotlib.pyplot as plt

import tensorflow as tf

def generate(sample_size, mean, cov, diff, regresssion):

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

return x0, y0

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)

# print(x)

colors = ['r' if l == 0 else 'b' for l in y[:]]

plt.scatter(x[:, 0], x[: ,1], c = colors)

plt.xlabel("scaled ade( in yrs)")

plt.ylabel("tumor size (in cm)")

plt.show()

執行以上**,得到如下結果:

2.構建網路結構

開始構建網路模型。

--i啟用函式使用的是sigomoid。

--損失函式使用的是loss交交叉熵,裡面又加了乙個平方差函式用來評估模型的錯誤率。

--優化器使用adamopimizer。

lab_dim = 1

input_dim = 2

input_features = tf.placeholder(tf.float32,[none, input_dim])

input_lables = tf.placeholder(tf.float32,[none, lab_dim])

#定義學習

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)

3.設定引數進行訓練令整個資料迭代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=)

sumerr = sumerr+errval

print("epoch:", '%04d' %(epoch+1), "cost=","".format(lossval), "err=",sumerr/minibatchsize)

每一次計算都會見err錯誤值累加起來,資料集迭代完一次會將err的錯誤率進行一次平均,平均值再輸出來。執行以上**,生成一下資訊:

經過50次迭代,得到了錯誤率為0.024的模型。

4.資料視覺化

下面可以直觀的將模型結果和樣本以視覺化的方式顯示出來,前一部分是先去100個測試點,在圖上顯示出來,接著將模型以一條直線 的方式顯示出來。

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)

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

執行**,會生成如下結果:

線性回歸與邏輯回歸

cost functionj 12m i 1m h x i y i hypothesish x tx 梯度下降求解 為了最小化j j j 1m i 1m h x i y i x i j 每一次迭代更新 j j 1m i 1m h x i y i x i j 正規方程求解 最小二乘法 xtx 1x t...

線性回歸和邏輯回歸

最近開始學習機器學習,有點心得體會,記錄一下,希望大家批評指正 監督學習 supervised learning 根據已有的資料集,知道輸入和輸出結果之間的關係。根據這種已知的關係,訓練得到乙個最優的模型。也就是說,在監督學習中訓練資料既有特徵 feature 又有標籤 label 通過訓練,讓機器...

線性回歸 和 邏輯回歸

跟著b站乙個小姐姐學的 很不錯 1 什麼是回歸 什麼是分類?簡單來說一般回歸問題在數值上是乙個連續的 而分類問題在數值上一般是離散型的 回歸 回歸模型的更傾向於很小的區域 或者是乙個x對應乙個y 線性回歸就不在討論了 這裡學習一下 邏輯回歸 邏輯回歸 聽起來是回歸 但實際上他是解決分類問題的 是乙個...