神经网络-鸢尾花

看了下面这篇神经网络入门之后感觉我也行了,拿鸢尾花分类做个实验

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

以下是运行结果

大概率是能跑准的
在这里插入图片描述
但也有概率跑飞
在这里插入图片描述
好了下载下当作课设来去骗老师吧

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值