神经网络第一次程序实验
【摘要】 神经网络第一次程序实验
神经网络第一次程序实验
题目说明:将一系列数据导入到程序并计算,利用感知器感知最终得到一组收敛的一元一次方程,随后利用sign函数进行分类。
平台判定机制吐槽:
对于希冀这个程序算法平台,
我的评价是:垃圾中的战斗机!
1.程序判别机制死板,只判定答案,给你们来个夸张的,见下图:
结果居然:
然后实验就直接满分通过了?!
2.答案固定,且没有变通
对于神经网络的题,不同的学习率得到的收敛权值和阈值都不相同的,然而答案判定却十分死板,只要W和b与答案不同就被判定是错的,直接0分。
这直接导致认真搞科研的反而做出来的多半是错误答案,只有直接赋值w和b的人才是100分。 垃圾平台,不多说了。
题目正确解法:
分析:
1.代码解读后小康发现数据中只用了前两列和最后一列。
分析代码:
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不一样,但是却一样能达到0.975的精度。也就是说,这个方程的预测能力跟答案是一样的。但是却是0分。
我们将学习率从1修改为0.4试试:
learnrate=0.4
得到结果为:
可以发现,结果虽然全部不跟平台答案相同,但是对数据处理的精度都满足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)