神经网络第一次程序实验

举报
小康不会AI 发表于 2022/09/16 13:02:37 2022/09/16
【摘要】 神经网络第一次程序实验

神经网络第一次程序实验

题目说明:将一系列数据导入到程序并计算,利用感知器感知最终得到一组收敛的一元一次方程,随后利用sign函数进行分类。

平台判定机制吐槽:

image.png
对于希冀这个程序算法平台,
我的评价是:垃圾中的战斗机!

1.程序判别机制死板,只判定答案,给你们来个夸张的,见下图:

image.png


结果居然:
image.png

然后实验就直接满分通过了?!

2.答案固定,且没有变通

对于神经网络的题,不同的学习率得到的收敛权值和阈值都不相同的,然而答案判定却十分死板,只要W和b与答案不同就被判定是错的,直接0分。
这直接导致认真搞科研的反而做出来的多半是错误答案,只有直接赋值w和b的人才是100分。 垃圾平台,不多说了。

题目正确解法:

分析:

1.代码解读后小康发现数据中只用了前两列和最后一列。
image.png
分析代码:

def load_data():
    inp = input()
    data = []
    while (inp):
        dx = [float(di) for di in inp.strip().split(',')]
        data.append(dx)
        inp = input()
    data = np.array(data)
    return data

意思是输入一组数据以逗号分割


def data_split(X, y, test_size=0.4, random_state=5):
    n_samples = len(X)
    assert len(X) == len(y)

    indices = np.arange(n_samples)
    random.seed(random_state)

    train_indexs = list(set(random.sample(indices.tolist(), int(n_samples * (1 - test_size)))))
    test_indexs = [k for k in indices if k not in train_indexs]
    return X[train_indexs, :], X[test_indexs, :], y[train_indexs], y[test_indexs]

提取并转换数据,分离出X_train, X_test, y_train, y_test

def predict(X, y, w, b):
    y_hat = np.sign(X.dot(w) + b)
    return sum(yi == yi_hat for yi, yi_hat in zip(y, y_hat)) / len(y)

如果预测正确返回1否则返回0,最后将所有结果求和取平均数作为预测精度。

下面就是我们主要写的核心算法:

def fit(X, y):
    shape_x = X.shape
    dim = shape_x[1]
    w = np.zeros(shape=(dim, 1))
    b = 0

    done = False
    #小康补充
    learnrate=1
    for i in range(50):
        for i in range(shape_x[0]):
            xk1 = X[i] + np.zeros(shape=(1, 2))
            w = w + (y[i] - np.sign(X[i].dot(w)[0] + b)) * learnrate * (xk1.T)

            b= b + (y[i] - np.sign(X[i].dot(w)[0] + b)) * learnrate
    #补充结束
  
    return w, b

实际上就是用到了感知器基本的反馈方法,

w = w + ( y s i g n ( w x + b ) ) l e a r n r a t e x . T w=w+(y-sign(wx+b))*learnrate*x.T

b = b + ( y s i g n ( w x + b ) ) l e a r n r a t e b=b+(y-sign(wx+b))*learnrate

最后运行结果就是:
image.png
可以发现肯定跟平台的w不一样,但是却一样能达到0.975的精度。也就是说,这个方程的预测能力跟答案是一样的。但是却是0分。
我们将学习率从1修改为0.4试试:

   learnrate=0.4

得到结果为:
image.png
可以发现,结果虽然全部不跟平台答案相同,但是对数据处理的精度都满足0.975.

全部代码:

import numpy  as  np
import random
def load_data():
    inp = input()
    data = []
    while (inp):
        dx = [float(di) for di in inp.strip().split(',')]
        data.append(dx)
        inp = input()
    data = np.array(data)
    return data

def data_split(X, y, test_size=0.4, random_state=5):
    n_samples = len(X)
    assert len(X) == len(y)
    indices = np.arange(n_samples)
    random.seed(random_state)
    train_indexs = list(set(random.sample(indices.tolist(), int(n_samples * (1 - test_size)))))
    test_indexs = [k for k in indices if k not in train_indexs]
    return X[train_indexs, :], X[test_indexs, :], y[train_indexs], y[test_indexs]

def fit(X, y):
    shape_x = X.shape
    dim = shape_x[1]
    w = np.zeros(shape=(dim, 1))
    b = 0
    done = False
    #小康补充
    learnrate=0.4
    for i in range(100):
        for i in range(shape_x[0]):
            xk1 = X[i] + np.zeros(shape=(1, 2))
            w = w + (y[i] - np.sign(X[i].dot(w)[0] + b)) * learnrate * (xk1.T)

            b= b + (y[i] - np.sign(X[i].dot(w)[0] + b)) * learnrate
    #补充结束
    return w, b
def predict(X, y, w, b):
    y_hat = np.sign(X.dot(w) + b)
    return sum(yi == yi_hat for yi, yi_hat in zip(y, y_hat)) / len(y)

data = load_data()
X = data[:, :2]
y = data[:, -1]
X_train, X_test, y_train, y_test = data_split(X, y)
w, b = fit(X_train, y_train)
acc = predict(X_test, y_test, w, b)
print(w)
print(b)
print(acc)

总结:

平台的校验正确与否应该根据数据的预测精度来评分,而不是权值和阈值。
如果权值和阈值固定了,准确率就永远停留在0.975了,万一还有精确度是1的好学生,还拿个0分就可惜了宝。
平台的答案,小康猜想是w和b运用了不同的学习率,w的学习率接近0.4,b的学习率接近1。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。