项目作业:分类任务

import numpy as np
import matplotlib.pyplot as plt

def generate_data(seed,data_size1,data_size2):
    np.random.seed(seed)
    # class 1
    datas_size_1 = data_size1
    # feature 1
    x1_1 = np.random.normal(loc = 5.0,scale = 1.0, size = datas_size_1)
    # feature 2
    x2_1 = np.random.normal(loc = 4.0,scale=1.0,size = datas_size_1)
    y_1 = [0 for i in range(datas_size_1)]

    # class 2
    datas_size_2 = data_size2
    # feature 1
    x1_2 = np.random.normal(loc = 5.0,scale=2.0,size=datas_size_2)
    # feature 2
    x2_2 = np.random.normal(loc = 4.0,scale = 2.0,size=datas_size_2)
    y_2 = [1 for i in range(datas_size_2)]

    #concatenate
    # 得到所有样本的第一个特征
    x1 = np.concatenate((x1_1,x1_2),axis = 0)
    # 所有样本的第二个特征
    x2 = np.concatenate((x2_1,x2_2),axis = 0)

    #合成为一个整的数据集,变为二维矩阵
    x = np.hstack((x1.reshape(-1,1),x2.reshape(-1,1)))
    y = np.concatenate((y_1,y_2),axis = 0)

    #总的数据
    data_size_all = datas_size_1+datas_size_2

    # 打乱数据
    shuffle_index = np.random.permutation(data_size_all)
    x = x[shuffle_index]
    y = y[shuffle_index]

    return x,y

# 计算梯度
def cal_gradient(X,Y,W,b):
    predict = 1/(1+np.exp(-(X.dot(W)+b)))
    w_gradient = (predict-Y).dot(X)
    b_gradient = (predict-Y).sum()
    return w_gradient,b_gradient

# 生成训练样本和测试样本
train_data,train_target = generate_data(321,300,400)
test_data,test_target = generate_data(432,200,100)
itermax = 1000
Loss = 0

W = np.zeros((2))
b = 0.5
error = 1e-6
lr = 0.001
Loss_his = []

for i in range(itermax):
    predict = 1/(1+np.exp(-(train_data.dot(W)+b)))
    w_g = np.zeros(W.shape)
    b_g = np.zeros((1))

    w_g,b_g = cal_gradient(train_data,train_target,W,b)
    W = W - lr * w_g
    b = b - lr * b_g

test_result = 1/(1+np.exp(-(test_data.dot(W)+b)))
test_predict = np.zeros(test_result.shape)
for i in range(len(test_result)):
    if(test_result[i] >= 0.5):
        test_predict[i] = 1
    else:
        test_predict[i] = 0

score = 0
for i in range(len(test_predict)):
    if(test_predict[i] == test_target[i]):
        score += 1

plt.plot(test_data[:][0],test_data[:][1],'r')
plt.show()
precise = score/len(test_predict)
print(precise)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值