看了下面这篇神经网络入门之后感觉我也行了,拿鸢尾花分类做个实验
https://mp.weixin.qq.com/s?__biz=MzU0MDQ1NjAzNg==&mid=2247528336&idx=3&sn=8d2e849dd7c4222ab3d19e035ed59339&chksm=fb3aca9bcc4d438d1d1e4a6ec941704156c4665246ab41a53d8cd3dc94888940f30e2c758906&scene=27
这里有上面这篇文章的英文原文,但我看不懂
https://victorzhou.com/blog/intro-to-neural-networks/#4-training-a-neural-network-part-2
这是程序
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(x):
# S函数: f(x) = 1 / (1 + e^(-x))
return 1 / (1 + np.exp(-x))
def deriv_sigmoid(x):
# S函数求导: f'(x) = f(x) * (1 - f(x))
fx = sigmoid(x)
return fx * (1 - fx)
def mse_loss(y_true, y_pred):
# 求丢失。
return (y_true - y_pred) ** 2
# 取数
def getdata(row):
df_Iris = pd.read_csv('Iris.csv')
data = np.array([[df_Iris.loc[row].SepalLengthCm, df_Iris.loc[row].SepalWidthCm, df_Iris.loc[row].PetalLengthCm,df_Iris.loc[row].PetalWidthCm]])
row+=1
for i in range(9):
row += i
data_tmp = np.array([[df_Iris.loc[row].SepalLengthCm, df_Iris.loc[row].SepalWidthCm, df_Iris.loc[row].PetalLengthCm,
df_Iris.loc[row].PetalWidthCm]])
data = np.append(data,data_tmp, axis=0)
pass
row += 50
for i in range(10):
row += i
data_tmp = np.array(
[[df_Iris.loc[row].SepalLengthCm, df_Iris.loc[row].SepalWidthCm, df_Iris.loc[row].PetalLengthCm,
df_Iris.loc[row].PetalWidthCm]])
data = np.append(data, data_tmp, axis=0)
pass
Species = np.array([[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])
return data,Species
# 相乘求和,后面的为一维数组
def xand(data1:range,data2:range):
sum = 0
for i in range(4):
sum+=data1[0,i]*data2[i]
pass
return sum
class test():
def __init__(self):
self.w1 = np.random.normal(0, 1, [1, 5])
self.w2 = np.random.normal(0, 1, [1, 5])
self.w3 = np.random.normal(0, 1, [1, 5])
self.w4 = np.random.normal(0, 1, [1, 5])
self.w5 = np.random.normal(0, 1, [1, 5])
pass
def feedforward(self,data:range):
self.h1_sum = xand(self.w1,data)+self.w1[0,4]
self.h1 = sigmoid(self.h1_sum)
self.h2_sum = xand(self.w2,data)+self.w2[0,4]
self.h2 = sigmoid(self.h2_sum)
self.h3_sum = xand(self.w3,data)+self.w3[0,4]
self.h3 = sigmoid(self.h3_sum)
self.h4_sum = xand(self.w4,data)+self.w4[0,4]
self.h4 = sigmoid(self.h4_sum)
tmp_arr = np.array([self.h1,self.h2,self.h3,self.h4])
self.o_sum =xand(self.w5,tmp_arr)+self.w5[0,4]
self.o = sigmoid(self.o_sum)
return self.o
pass
def train(self,data,Species):
learn_rate = 0.02
epochs = 10000 # 遍历整个数据集的次数
for epoch in range(epochs):
for x,y in zip(data,Species):
# 提前计算
y_pred = self.feedforward(x)
x1 = -2*(y[0]-y_pred)
for i in range(4):
self.w1[0][i] -= x1 * self.w5[0][1] * deriv_sigmoid(self.o_sum) * x[i] * deriv_sigmoid(self.h1_sum) *learn_rate
pass
self.w1[0][4] -= x1 * self.w5[0][1] * deriv_sigmoid(self.o_sum) * deriv_sigmoid(self.h1_sum)*learn_rate
for i in range(4):
self.w2[0][i] -= x1 * self.w5[0][2] * deriv_sigmoid(self.o_sum) * x[i] * deriv_sigmoid(self.h2_sum)*learn_rate
pass
self.w2[0][4] -= x1 * self.w5[0][2] * deriv_sigmoid(self.o_sum) * deriv_sigmoid(self.h2_sum)*learn_rate
for i in range(4):
self.w3[0][i] -= x1 * self.w5[0][3] * deriv_sigmoid(self.o_sum) * x[i] * deriv_sigmoid(self.h3_sum)*learn_rate
pass
self.w3[0][4] -= x1 * self.w5[0][3] * deriv_sigmoid(self.o_sum) * deriv_sigmoid(self.h3_sum)*learn_rate
for i in range(4):
self.w4[0][i] -= x1 * self.w5[0][4] * deriv_sigmoid(self.o_sum) * x[i] * deriv_sigmoid(self.h4_sum)*learn_rate
pass
self.w4[0][4] -= x1 * self.w5[0][4] * deriv_sigmoid(self.o_sum) * deriv_sigmoid(self.h4_sum)*learn_rate
self.w5[0][0] -= x1 * deriv_sigmoid(self.o_sum) * self.h1 *learn_rate
self.w5[0][1] -= x1 * deriv_sigmoid(self.o_sum) * self.h2 *learn_rate
self.w5[0][2] -= x1 * deriv_sigmoid(self.o_sum) * self.h3 *learn_rate
self.w5[0][3] -= x1 * deriv_sigmoid(self.o_sum) * self.h4 *learn_rate
self.w4[0][4] -= x1 * deriv_sigmoid(self.o_sum)*learn_rate
pass
# if epoch % 20 == 0:
# print(epoch)
# 取数
data,Species = getdata(5)
# print(data[2])
# print(Species[2])
network = test()
for i in range(20):
print(network.feedforward(data[i]))
network.train(data,Species)
print("-------------------------------------------------")
data,Species = getdata(15)
for i in range(20):
print(network.feedforward(data[i]))
四个量输入,一个量输出,中间一层,只用到了前100行数据
0输出表示Iris-setosa
1输出表示Iris-versicolor
越接近概率越大
鸢尾花的数据在这下载
https://www.kaggle.com/code/benhamner/python-data-visualizations/input
以下是运行结果
大概率是能跑准的
但也有概率跑飞
好了下载下当作课设来去骗老师吧