在飞书搞了个机器人,我让ChatGPT帮忙写算法

news2024/12/30 2:45:37

一、前言

环境:
系统:Windows 11 64位
Python版本:Python 3.9

注:本文不讲怎么实现,只讲实现的效果和一些思考。大家感兴趣再考虑去配置相关机器人。

先来问问ChatGPT两个问题:
1、ChatGPT是什么?
来看看ChatGPT对自己的定义:
image.png

ChatGPT是一种基于自然语言处理(NLP)的聊天机器人技术,它可以帮助用户与聊天机器人进行自然语言交流。ChatGPT使用深度学习技术来模拟人类的自然语言交流,从而实现自然语言处理(NLP)的聊天机器人功能。

2、ChatGPT能做什么?
来看看ChatGPT对自己的定义:
image.png

试用一番之后,我有个强烈的感受——ChatGPT真的太强大了!
它像是一个全能型选手,可以帮助我了解一些未知的领域,帮我解答一些其他领域很小白的问题,只要你有问题,它可以不厌其烦地给你解答。
如果你在学习某个领域的知识,遇到难题了,问它,或许也可以给你答案或者一些启发。
更让我惊喜的是,它还可以帮我写算法,大大提高了我的学习效率,太爱了!接下来介绍三个算法小例子:

注:本篇文章只讲故事,不讲原理和操作

二、让ChatGPT帮我写算法

以下简述下ChatGPT为我写的3个算法。

2.1 二分法

image.png

def binary_search(list, item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (low + high) // 2
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

my_list = [1, 3, 5, 7, 9]

print(binary_search(my_list, 3))  # => 1
print(binary_search(my_list, -1)) # => None

我记得之前一开始写二分法算法的时候,还遇到一个坑,就是不知道这种从[0, n-1]的边界值处理方式,后来采用了[-1, n]完美地解决了问题,今天AI教会了我,原来是要在重新赋值low和high变量的时候,进行加1和减1的处理,get到了!!!

2.2 Apriori算法

Apriori算法是一种用于发现关联规则的数据挖掘算法,它的基本思想是:如果某个项集是频繁项集,那么它的所有子集也是频繁项集。Apriori算法通过迭代的方式来寻找频繁项集,它的基本步骤如下:

  1. 从原始数据中构建候选项集,并计算每个项集的支持度;
  2. 根据支持度的阈值筛选出频繁项集;
  3. 从频繁项集中构建关联规则;
  4. 根据置信度的阈值筛选出有效的关联规则。

接下来问问ChatGPT怎么用Python实现该算法。
image.png
ChatGPT用Python帮我写的Apriori算法代码,还带了一个数据集,直接拿来跑就完事了。
如果想要用自己的数据集,直接替换以下代码的dataset即可,简直不要太容易!
ChatGPT提供的完整代码如下:

# > Python实现Apriori算法
# -*- coding:utf-8 -*-

# 导入相关库
import pandas as pd
import numpy as np

# 加载数据集
dataset = [['牛奶', '面包', '尿布', '啤酒', '鸡蛋'],
           ['牛奶', '尿布', '啤酒', '可乐'],
           ['面包', '牛奶', '尿布', '啤酒'],
           ['面包', '牛奶', '尿布', '可乐']]

# 将数据集转换为DataFrame格式
df = pd.DataFrame(dataset)

# 定义Apriori算法函数
def apriori(data, min_support=0.5):
    # 将数据转换为集合格式
    C1 = create_C1(data)
    # 将数据集转换为二维列表
    D = list(map(set, data))
    # 构建初始候选项集C1
    L1, support_data = scan_D(D, C1, min_support)
    # 构建完整的候选项集Ck
    L = [L1]
    k = 2
    while (len(L[k-2]) > 0):
    Ck = apriori_gen(L[k-2], k)
    Lk, supK = scan_D(D, Ck, min_support)
    support_data.update(supK)
    L.append(Lk)
    k += 1
    return L, support_data

    # 构建初始候选项集C1
    def create_C1(data):
    C1 = []
    for transaction in data:
    for item in transaction:
    if not [item] in C1:
    C1.append([item])
    C1.sort()
    return list(map(frozenset, C1))

    # 扫描数据集,从C1生成L1
    def scan_D(D, Ck, min_support):
    ss_cnt = {}
    for tid in D:
    for can in Ck:
    if can.issubset(tid):
    if can not in ss_cnt:
    ss_cnt[can] = 1
else:
    ss_cnt[can] += 1
    num_items = float(len(D))
    ret_list = []
    support_data = {}
    for key in ss_cnt:
    support = ss_cnt[key] / num_items
    if support >= min_support:
    ret_list.insert(0, key)
    support_data[key] = support
    return ret_list, support_data

    # 根据频繁项集的集合进行合并
    def apriori_gen(Lk, k):
    ret_list = []
    len_Lk = len(Lk)
    for i in range(len_Lk):
    for j in range(i+1, len_Lk):
    L1 = list(Lk[i])[:k-2]
    L2 = list(Lk[j])[:k-2]
    L1.sort()
    L2.sort()
    if L1 == L2:
    ret_list.append(Lk[i] | Lk[j])
    return ret_list

    # 调用Apriori算法
    L, support_data = apriori(dataset, min_support=0.5)

    # 打印结果
    print("频繁项集:", L)
    print("所有候选项集的支持度信息:", support_data) 

2.3 感知机

这个稍微复杂一些,返回的代码似乎有点问题,我用Python 3.9不能直接跑。
只要是格式化那部分%!s(MISSING)%!f(MISSING)%!((MISSING)self.weights, self.bias)%!d(MISSING)%!a(MISSING)nd_perception.predict([1, 1]))
代码如下:

# > Python实现感知机
# 感知机
import numpy as np

# 定义激活函数
def sign(x):
    if x >= 0:
        return 1
    else:
        return -1

# 定义感知机
class Perceptron(object):
    def __init__(self, input_num, activator):
        self.activator = activator
        # 权重向量初始化为0
        self.weights = [0.0 for _ in range(input_num)]
        # 偏置项初始化为0
        self.bias = 0.0

    def __str__(self):
        return 'weights\t:%!s(MISSING)\nbias\t:%!f(MISSING)\n' %!((MISSING)self.weights, self.bias)

    # 输入向量,计算感知机的输出
    def predict(self, input_vec):
        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
        # 最后利用reduce求和
        return self.activator(
            np.dot(input_vec, self.weights) + self.bias)

    # 输入训练数据:一组向量、与每个向量对应的label;以及训练轮数,根据训练数据调整权重
    def train(self, input_vecs, labels, iteration, rate):
        for i in range(iteration):
            self._one_iteration(input_vecs, labels, rate)

    # 一次迭代,把所有的训练数据过一遍
    def _one_iteration(self, input_vecs, labels, rate):
        # 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]
        # 而每个训练样本是(input_vec, label)
        samples = zip(input_vecs, labels)
        # 对每个样本,按照感知机规则更新权重
        for (input_vec, label) in samples:
            # 计算感知机在当前权重下的输出
            output = self.predict(input_vec)
            # 更新权重
            self._update_weights(input_vec, output, label, rate)

    # 按照感知机规则更新权重
    def _update_weights(self, input_vec, output, label, rate):
        # 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用感知器规则更新权重
        delta = label - output
        self.weights = list(map(
            lambda x_w: x_w[1] + rate * delta * x_w[0],
            zip(input_vec, self.weights)))
        # 更新bias
        self.bias += rate * delta

def f(x):
    return 1 if x > 0 else 0

def get_training_dataset():
    # 构建训练数据
    # 输入向量列表
    input_vecs = [[1,1], [0,0], [1,0], [0,1]]
    # 期望的输出列表,注意要与输入一一对应
    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0
    labels = [1, 0, 0, 0]
    return input_vecs, labels

def train_and_perceptron():
    # 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f
    p = Perceptron(2, f)
    # 训练,迭代10轮, 学习速率为0.1
    input_vecs, labels = get_training_dataset()
    p.train(input_vecs, labels, 10, 0.1)
    #返回训练好的感知器
    return p

if __name__ == '__main__':
    # 训练and感知器
    and_perception = train_and_perceptron()
    # 打印训练获得的权重
    print(and_perception)
    # 测试
    print('1 and 1 = %!d(MISSING)' %!a(MISSING)nd_perception.predict([1, 1]))
    print('0 and 0 = %!d(MISSING)' %!a(MISSING)nd_perception.predict([0, 0]))
    print('1 and 0 = %!d(MISSING)' %!a(MISSING)nd_perception.predict([1, 0]))
    print('0 and 1 = %!d(MISSING)' %!a(MISSING)nd_perception.predict([0, 1]))

这些有点超出了我的认知,我问ChatGPTpython %!d 是什么意思,它说“%!!(MISSING)d 是Python中的格式化字符串,它表示将变量替换为其对应的十进制整数。 ”
怎么回答多了个!
image.png
接着用它提供的信息,问%!!(MISSING)d 怎么使用,它回复的信息似乎有点问题:

  • %!n(MISSING)umber应该是%!(MISSING)number
  • "%!d(MISSING)" %!(MISSING)10并不能直接跑,这是无效语法image.png

image.png
官网查了一下,也没有格式化+missing的相关资料,直接百度也没有找到。先姑且认为是一个bug吧。修改一下格式化部分,便可以正常跑了,改完具体代码如下:

# > Python实现感知机
# 感知机
import numpy as np

# 定义激活函数
def sign(x):
    if x >= 0:
        return 1
    else:
        return -1

# 定义感知机
class Perceptron(object):
    def __init__(self, input_num, activator):
        self.activator = activator
        # 权重向量初始化为0
        self.weights = [0.0 for _ in range(input_num)]
        # 偏置项初始化为0
        self.bias = 0.0

    def __str__(self):
        # return 'weights\t:%!s(MISSING)\nbias\t:%!f(MISSING)\n' %!((MISSING)self.weights, self.bias)
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
    # 输入向量,计算感知机的输出
    def predict(self, input_vec):  #input_vec相当于X
        # 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用map函数计算[x1*w1, x2*w2, x3*w3]
        # 最后利用reduce求和
        return self.activator(np.dot(input_vec, self.weights) + self.bias)

    # 输入训练数据:一组向量、与每个向量对应的label;以及训练轮数,根据训练数据调整权重
    def train(self, input_vecs, labels, iteration, rate):
        for i in range(iteration):
            self._one_iteration(input_vecs, labels, rate)

    # 一次迭代,把所有的训练数据过一遍
    def _one_iteration(self, input_vecs, labels, rate):
        # 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]
        # 而每个训练样本是(input_vec, label)
        samples = zip(input_vecs, labels)
        # 对每个样本,按照感知机规则更新权重
        for (input_vec, label) in samples:
            # 计算感知机在当前权重下的输出
            output = self.predict(input_vec)
            # 更新权重
            self._update_weights(input_vec, output, label, rate)

    # 按照感知机规则更新权重
    def _update_weights(self, input_vec, output, label, rate):
        # 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起
        # 变成[(x1,w1),(x2,w2),(x3,w3),...]
        # 然后利用感知器规则更新权重
        delta = label - output   #实际值-预测值
        self.weights = list(map(
            lambda x_w: x_w[1] + rate * delta * x_w[0],  #速率*(实际值-预测值)*x值
            zip(input_vec, self.weights)))
        # 更新bias
        self.bias += rate * delta

def f(x):
    return 1 if x > 0 else 0

def get_training_dataset():
    """
    input_vecs相当于X_train
    labels相当于y_train
    :return:
    """
    # 构建训练数据
    # 输入向量列表
    input_vecs = [[1,1], [0,0], [1,0], [0,1]]
    # 期望的输出列表,注意要与输入一一对应
    # [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0
    labels = [1, 0, 0, 0]
    return input_vecs, labels

def train_and_perceptron():
    # 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为f
    p = Perceptron(2, f)
    # 训练,迭代10轮, 学习速率为0.1
    input_vecs, labels = get_training_dataset()
    p.train(input_vecs, labels, 10, 0.1)
    #返回训练好的感知器
    return p

if __name__ == '__main__':
    # 训练and感知器
    and_perception = train_and_perceptron()
    # 打印训练获得的权重
    print(and_perception)
    # 测试
    # print('1 and 1 = %!d(MISSING)' %!(MISSING)and_perception.predict([1, 1]))
    # print('0 and 0 = %!d(MISSING)' %!(MISSING)and_perception.predict([0, 0]))
    # print('1 and 0 = %!d(MISSING)' %!(MISSING)and_perception.predict([1, 0]))
    # print('0 and 1 = %!d(MISSING)' %!(MISSING)and_perception.predict([0, 1]))
    print('1 and 1 = %d' % and_perception.predict([1, 1]))
    print('0 and 0 = %d' % and_perception.predict([0, 0]))
    print('1 and 0 = %d' % and_perception.predict([1, 0]))
    print('0 and 1 = %d' % and_perception.predict([0, 1]))

三、小结

不得不说,ChatGPT很给力!不然也不会那么火爆,对于未知的领域,我们经常会有各种各样的“傻”问题,或许也会有一些不好意思问导师或者专家,生怕问题太小白了,被“嫌弃”,而且脑子里无穷的问号,需要占用别人很长的时间才能够一一解答,通过ChatGPT可以解决我们类似的绝大多数比较小白的问题,帮助我们一定程度入门相关知识领域。

上面的描述,或许当过父母的会有更“痛”的领悟,小孩在4岁前后脑袋瓜里就会装这各种各样的奇思妙想,或许ChatGPT会更配,可以满足孩子各种各样的好奇心,当然,这只是一个设想,具体需要验证一下~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试题总结-面向对象

面试题总结第一篇面向对象面向对象和面向过程的区别面向对象三大特性Java是如何实现多态的面向对象 面向对象和面向过程的区别 面向过程&#xff1a; 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如…

非零基础自学计算机操作系统 第1章 操作系统概述 1.2 操作系统的历史 1.2.1 操作系统的产生

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.2 操作系统的历史1.2.1 操作系统的产生第1章 操作系统概述 1.2 操作系统的历史 由于操作系统是直接建造于硬件层之上的&#xff0c;它的演变必然与计算机系统结构的演变有着密切的联系。 …

Java基于JSP的小区内部物业管理系统

对于规模较小的物业管理公司来说,传统的人工小区物业管理模式仍旧可以应付日常的工作需求。但是,随着该行业不断的发展,竞争日益激烈,提高物业管理的工作水平与效率、为业主提供更好的服务,已经成为物业管理公司当前必须考虑的问题。而将计算机引入到管理机制中来将是一个不错的…

2022-12- 05 网工进阶(三十七)MPLS--基本概念、转发过程、基本配置、配置静态LSR

MPLS概述 基本概念 MPLS&#xff08;Multi-Protocol Label Switching&#xff0c;多协议标签交换&#xff09;位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部…

木字楠后台管理系统开发(3):Vue项目初始化并引入基础依赖

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(3)&#xff1a;Vue项目初始化并引入基础依赖 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;温度骤降&#xff0c;差点给爷送走。 &#x1f4…

Js逆向教程23-AST Babel插件最简单修改值示例

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; AST Babel插件最简单修改值示例 一、文档地址和安装的方式 https://github.com/jamiebuilds/babel-handbook/blob/master/translation…

动态规划

什么是动态规划 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。 动态规划的前提是什么&#xff1f; 存在最优解 拿出来任意一块物品&#xff0c;仍旧是最…

详解C++11

文章目录前言一、C11简介二、统一的列表初始化2.1 {}的初始化2.2 std::initializer_list三、声明3.1 auto3.2 decltype3.3 nullptr四、范围for五、智能指针六、STL中一些变化新容器容器中的一些新方法七、右值引用和移动语义7.1 左值引用和右值引用7.2 左值引用和右值引用比较左…

灵魂拷问,你真的了解DNS吗?

未来已来&#xff0c;只是不均衡地分布在当下 大家好&#xff0c;我是菜农&#xff0c;欢迎来到我的频道。 都说程序员是面向Google编程&#xff0c;殊不知当你输入 www.google.com 地址的时候&#xff0c;是否有想过&#xff0c;在回车的一瞬间浏览器如何将请求发送&#xff…

价值年薪70W的JAVA进阶学习路线!终于让我从阿里P8手里抠出来了

作为一个男人我感觉必须得做点什么来证明一下自己&#xff0c;现在我又回来了&#xff0c;准备把自己的节操准备补一下。另外给各位未来的Java程序员说一句&#xff0c;别的我不清楚&#xff0c;学习编程请从一而终 咱们学习编程就挺难的&#xff0c;有这些先驱者来带领咱们学习…

【Maven基础】命令行环境使用

实验一&#xff1a;根据坐标创建 Maven 工程 1、Maven 核心概念&#xff1a;坐标 1.1、数学中的坐标 使用 x、y、z 三个『向量』作为空间的坐标系&#xff0c;可以在『空间』中唯一的定位到一个『点』。 1.2、Maven中的坐标 1.2.1、向量说明 使用三个『向量』在『Maven的仓…

[附源码]计算机毕业设计会议室预定管理APPSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【个人笔记 hive】hive里面的说SerDe含义

官网中这样介绍serde&#xff1a;https://cwiki.apache.org/confluence/display/Hive/SerDe&#xff1a; SerDe Overview SerDe is short for Serializer/Deserializer. Hive uses the SerDe interface for IO. The interface handles both serialization and deserialization …

Linux中mysql的安装|配置|操作|卸载

文章目录1. mysql的卸载1.1 首先查询系统是否安装了MySQL1.2 关闭MySQL服务1.3 查看MySQL对应的文件夹1.4 卸载并删除MySQL安装的组键服务1.5 删除系统中MySQL的所有文件夹1.6 最后验证MySQL是否删除完成2. mysql的安装与配置2.1 下载mysql8.0安装包2.2 解压mysql8.0安装包2.3 …

蜂鸟学习笔记E203(七)——写回、存储器和ICB总线

一、 蜂鸟E203处理器的写回硬件实现 核心思想如下 将指令划分为单周期指令和长指令两大类将长指令的交付和写回分开&#xff0c;使得即使执行力多周期的长指令也不会阻塞流水线&#xff0c;妨碍单指令 主要包含最终写回仲裁、长指令写回仲裁 最终写回仲裁 长指令的写回比…

Python的数据结构- 序列(sequence)

数据结构 - 序列&#xff08;sequence&#xff09; 序列的一个特点就是根据索引&#xff08;index&#xff0c;即元素的位置&#xff09;来获取序列中的元素&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;以此类推。 所有序列类型都可以进行某些通用的操作…

ChatGPT教我面试

​持续坚持原创输出&#xff0c;点击蓝字关注我吧 最近ChatGPT爆火&#xff0c;ChatGPT能干什么呢&#xff1f;想必已经看过很多文章了&#xff0c;例如ChatGPT通过美国高考、ChatGPT开发游戏、调试代码、写文章等等。 哈哈&#xff0c;作为一个软件测试博主&#xff0c;我怎么…

frp内网穿透SSH

参考博客: 博客1(推荐): https://sspai.com/post/52523 博客2: https://blog.csdn.net/qq_36981760/article/details/115713179 博客3: https://blog.csdn.net/qq_36981760/article/details/115713179 参考视频 (推荐&#xff0c;比较详细): https://www.bilibili.com/video/BV…

谈谈inline(内联函数)

目录1、例子抛出2、 了解inline2.1 宏替换的副作用2.2 内联函数2.3 有意思的点3、总结4、 感谢您的阅读&#xff01;1、例子抛出 我们知道可以用宏定义来代替一个变量或者函数块&#xff1a; #define A 20 #define MYFUNC(a,b) (&#xff08;a&#xff09; > &#xff08;…

Kubernetes双主集群的部署(二)

Kubernetes单主集群的部署&#xff08;一&#xff09;_Evens7xxX的博客-CSDN博客 上期完成了单主架构集群的部署&#xff0c;本期将在单主架构的基础上添加Master和负载均衡器 目录 二、k8s双主架构集群的部署 1.另一台Master同样做初始化配置 2.配置 Master02 3.配置负载均…