机器学习-10-神经网络python实现-从零开始

文章目录

    • 总结
    • 参考
    • 本门课程的目标
    • 机器学习定义
    • 从零构建神经网络
      • 手写数据集MNIST介绍
      • 代码读取数据集MNIST
      • 神经网络实现
      • 测试手写的图片
    • 带有反向查询的神经网络实现

总结

本系列是机器学习课程的系列课程,主要介绍基于python实现神经网络。

参考

BP神经网络及python实现(详细)

本文来源原文链接:https://blog.csdn.net/weixin_66845445/article/details/133828686

用Python从0到1实现一个神经网络(附代码)!

python神经网络编程代码https://gitee.com/iamyoyo/makeyourownneuralnetwork.git

本门课程的目标

完成一个特定行业的算法应用全过程:

懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合
+算法评估+持续调优+工程化接口实现

机器学习定义

关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用:
对于某类任务T性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习
在这里插入图片描述

从零构建神经网络

手写数据集MNIST介绍

mnist_dataset

MNIST数据集是一个包含大量手写数字的集合。 在图像处理领域中,它是一个非常受欢迎的数据集。 经常被用于评估机器学习算法的性能。 MNIST是改进的标准与技术研究所数据库的简称。 MNIST 包含了一个由 70,000 个 28 x 28 的手写数字图像组成的集合,涵盖了从0到9的数字。

本文通过神经网络基于MNIST数据集进行手写识别。

代码读取数据集MNIST

导入库

import numpy
import matplotlib.pyplot

读取mnist_train_100.csv

# open the CSV file and read its contents into a list
data_file = open("mnist_dataset/mnist_train_100.csv", 'r')
data_list = data_file.readlines()
data_file.close()

查看数据集的长度

# check the number of data records (examples)
len(data_list)
# 输出为 100

查看一条数据,这个数据是手写数字的像素值

# show a dataset record
# the first number is the label, the rest are pixel colour values (greyscale 0-255)
data_list[1]

输出为:
在这里插入图片描述
需要注意的是,这个字符串的第一个字为真实label,比如

data_list[50]

输出为:
在这里插入图片描述

这个输出看不懂,因为这是一个很长的字符串,我们对其进行按照逗号进行分割,然后输出为28*28的,就能看出来了

# take the data from a record, rearrange it into a 28*28 array and plot it as an image
all_values = data_list[50].split(',')
num=0
for i in all_values[1:]:num = num +1print("%-3s"%(i),end=' ')if num==28:num = 0print('',end='\n')

输出为:
在这里插入图片描述

通过用图片的方式查看

# take the data from a record, rearrange it into a 28*28 array and plot it as an image
all_values = data_list[50].split(',')
image_array = numpy.asfarray(all_values[1:]).reshape((28,28))
matplotlib.pyplot.imshow(image_array, cmap='Greys', interpolation='None')

输出为:
在这里插入图片描述

这个像素值为0-255,对其进行归一化操作

# scale input to range 0.01 to 1.00
scaled_input = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# print(scaled_input)
scaled_input

输出为:
在这里插入图片描述

构建一个包含十个输出的标签

#output nodes is 10 (example)
onodes = 10
targets = numpy.zeros(onodes) + 0.01
targets[int(all_values[0])] = 0.99
# print(targets)
targets

输出为:
在这里插入图片描述

神经网络实现

导入库

import numpy
# scipy.special for the sigmoid function expit()
import scipy.special
# library for plotting arrays
import matplotlib.pyplot

神经网络实现

# neural network class definition
# 神经网络类定义
class neuralNetwork:# initialise the neural network# 初始化神经网络def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):# set number of nodes in each input, hidden, output layer# 设置每个输入、隐藏、输出层的节点数self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes# link weight matrices, wih and who# weights inside the arrays are w_i_j, where link is from node i to node j in the next layer# w11 w21# w12 w22 etc # 链接权重矩阵,wih和who# 数组内的权重w_i_j,链接从节点i到下一层的节点j# w11 w21# w12 w22 等等self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))# learning rate 学习率self.lr = learningrate# activation function is the sigmoid function# 激活函数是sigmoid函数self.activation_function = lambda x: scipy.special.expit(x)pass# train the neural network# 训练神经网络def train(self, inputs_list, targets_list):# convert inputs list to 2d array# 将输入列表转换为2d数组inputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, ndmin=2).T# calculate signals into hidden layer# 计算输入到隐藏层的信号hidden_inputs = numpy.dot(self.wih, inputs)# calculate the signals emerging from hidden layer# 计算从隐藏层输出的信号hidden_outputs = self.activation_function(hidden_inputs)# calculate signals into final output layer# 计算最终输出层的信号final_inputs = numpy.dot(self.who, hidden_outputs)# calculate the signals emerging from final output layer# 计算从最终输出层输出的信号final_outputs = self.activation_function(final_inputs)# output layer error is the (target - actual)# 输出层误差是(目标 - 实际)output_errors = targets - final_outputs# hidden layer error is the output_errors, split by weights, recombined at hidden nodes# 隐藏层误差是输出层误差,按权重分解,在隐藏节点重新组合hidden_errors = numpy.dot(self.who.T, output_errors) # update the weights for the links between the hidden and output layers# 更新隐藏层和输出层之间的权重self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))# update the weights for the links between the input and hidden layers# 更新输入层和隐藏层之间的权重self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))pass# query the neural network# 查询神经网络def query(self, inputs_list):# convert inputs list to 2d array# 将输入列表转换为2d数组inputs = numpy.array(inputs_list, ndmin=2).T# calculate signals into hidden layer# 计算输入到隐藏层的信号hidden_inputs = numpy.dot(self.wih, inputs)# calculate the signals emerging from hidden layer# 计算从隐藏层输出的信号hidden_outputs = self.activation_function(hidden_inputs)# calculate signals into final output layer# 计算最终输出层的信号final_inputs = numpy.dot(self.who, hidden_outputs)# calculate the signals emerging from final output layer# 计算从最终输出层输出的信号final_outputs = self.activation_function(final_inputs)return final_outputs

定义参数,并初始化神经网络

# number of input, hidden and output nodes
input_nodes = 784
hidden_nodes = 200
output_nodes = 10# learning rate
learning_rate = 0.1# create instance of neural network
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
n # <__main__.neuralNetwork at 0x2778590e5e0>

查看数据集

# load the mnist training data CSV file into a list
training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
len(training_data_list) # 60001
# 其中第1行为列名 ,后面需要去掉,只保留后60000条

开始训练,该步骤需要等待一会,才能训练完成

# train the neural network
# 训练神经网络
# epochs is the number of times the training data set is used for training
# epochs次数,循环训练5次
epochs = 5for e in range(epochs):# go through all records in the training data set# 每次取60000条数据,剔除列名for record in training_data_list[1:]:# split the record by the ',' commas# 用逗号分割all_values = record.split(',')# scale and shift the inputs# 对图像的像素值进行归一化操作inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01# create the target output values (all 0.01, except the desired label which is 0.99)# 创建一个包含十个输出的向量,初始值为0.01targets = numpy.zeros(output_nodes) + 0.01# all_values[0] is the target label for this record# 对 label的 位置设置为0.99targets[int(all_values[0])] = 0.99# 开始训练n.train(inputs, targets)passpass

查看训练后的权重

n.who.shape # (10, 200)
n.who

输出为:
在这里插入图片描述

n.wih.shape # ((200, 784)
n.wih

输出为:
在这里插入图片描述

查看测试集

# load the mnist test data CSV file into a list
test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
len(test_data_list) # 10001
# 其中第1行为列名 ,后面需要去掉,只保留后10000条

预测测试集

# test the neural network
# 测试网络
# scorecard for how well the network performs, initially empty
# 计算网络性能,初始为空
scorecard = []# go through all the records in the test data set
# 传入所有的测试集
for record in test_data_list[1:]:# split the record by the ',' commas# 使用逗号分割all_values = record.split(',')# correct answer is first value# 获取当前的测试集的labelcorrect_label = int(all_values[0])# scale and shift the inputs# 归一化操作inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01# query the network# 对测试集进行预测outputs = n.query(inputs)# the index of the highest value corresponds to the label# 获取输出中最大的概率的位置label = numpy.argmax(outputs)# append correct or incorrect to list# 按照预测的正确与否分别填入1和0if (label == correct_label):# network's answer matches correct answer, add 1 to scorecard# 答案匹配正确,输入1scorecard.append(1)else:# network's answer doesn't match correct answer, add 0 to scorecard# 答案不匹配,输入0scorecard.append(0)passpass

计算网络性能

# calculate the performance score, the fraction of correct answers
scorecard_array = numpy.asarray(scorecard)
print ("performance = ", scorecard_array.sum() / scorecard_array.size)
# performance =  0.9725

输出为:

performance = 0.9725

测试手写的图片

导入库

# helper to load data from PNG image files
import imageio.v3
# glob helps select multiple files using patterns
import glob

定义数据集列表

# our own image test data set
our_own_dataset = []

读取多个数据

# glob.glob获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。glob.glob同时获取所有的匹配路径
for image_file_name in glob.glob('my_own_images/2828_my_own_?.png'):# 输出 匹配到的文件print ("loading ... ", image_file_name)# use the filename to set the correct label# 文件名中包含了文件的正确标签label = int(image_file_name[-5:-4])# load image data from png files into an array# 把 图片转换为 文本img_array = imageio.v3.imread(image_file_name, mode='F')# reshape from 28x28 to list of 784 values, invert values# 把28*28的矩阵转换为 784和1维img_data  = 255.0 - img_array.reshape(784)# then scale data to range from 0.01 to 1.0# 对数据进行归一化操作,最小值为0.01img_data = (img_data / 255.0 * 0.99) + 0.01print(numpy.min(img_data))print(numpy.max(img_data))# append label and image data  to test data set# 把 laebl和图片拼接起来record = numpy.append(label,img_data)print(record.shape)# 把封装好的 一维存储在列表中our_own_dataset.append(record)pass

读取的数据如下:

在这里插入图片描述
输出为,
在这里插入图片描述

查看手写的图片

matplotlib.pyplot.imshow(our_own_dataset[0][1:].reshape(28,28), cmap='Greys', interpolation='None')

输出为:
在这里插入图片描述

输出对应的像数值

# print(our_own_dataset[0])
print(our_own_dataset[0][0],"\n",our_own_dataset[0][1:20])

输出如下:
在这里插入图片描述

测试手写数据效果

own_list = []
for i in our_own_dataset:correct_label = i[0]img_data = i[1:]# query the networkoutputs = n.query(img_data)
#     print ('outputs预测',outputs)# the index of the highest value corresponds to the labellabel = numpy.argmax(outputs)print('真实',correct_label,"network says ", label)if (label == correct_label):# network's answer matches correct answer, add 1 to scorecardown_list.append(1)else:# network's answer doesn't match correct answer, add 0 to scorecardown_list.append(0)print("own_list",own_list)

输出为:
在这里插入图片描述

带有反向查询的神经网络实现

该部分代码与 从零构建神经网络大多类似,代码如下:

导入库

import numpy
# scipy.special for the sigmoid function expit(), and its inverse logit()
import scipy.special
# library for plotting arrays
import matplotlib.pyplot

定义带有反向查询的神经网络

# neural network class definition
# 神经网络类定义
class neuralNetwork:# initialise the neural network# 初始化神经网络def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):# set number of nodes in each input, hidden, output layer# 设置每个输入、隐藏、输出层的节点数self.inodes = inputnodesself.hnodes = hiddennodesself.onodes = outputnodes# link weight matrices, wih and who# weights inside the arrays are w_i_j, where link is from node i to node j in the next layer# w11 w21# w12 w22 etc # 链接权重矩阵,wih和who# 数组内的权重w_i_j,链接从节点i到下一层的节点j# w11 w21# w12 w22 等等self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))# learning rate 学习率self.lr = learningrate# activation function is the sigmoid function# 激活函数是sigmoid函数self.activation_function = lambda x: scipy.special.expit(x)self.inverse_activation_function = lambda x: scipy.special.logit(x)pass# train the neural network# 训练神经网络def train(self, inputs_list, targets_list):# convert inputs list to 2d array# 将输入列表转换为2d数组inputs = numpy.array(inputs_list, ndmin=2).Ttargets = numpy.array(targets_list, ndmin=2).T# calculate signals into hidden layer# 计算输入到隐藏层的信号hidden_inputs = numpy.dot(self.wih, inputs)# calculate the signals emerging from hidden layer# 计算从隐藏层输出的信号hidden_outputs = self.activation_function(hidden_inputs)# calculate signals into final output layer# 计算最终输出层的信号final_inputs = numpy.dot(self.who, hidden_outputs)# calculate the signals emerging from final output layer# 计算从最终输出层输出的信号final_outputs = self.activation_function(final_inputs)# output layer error is the (target - actual)# 输出层误差是(目标 - 实际)output_errors = targets - final_outputs# hidden layer error is the output_errors, split by weights, recombined at hidden nodes# 隐藏层误差是输出层误差,按权重分解,在隐藏节点重新组合hidden_errors = numpy.dot(self.who.T, output_errors) # update the weights for the links between the hidden and output layers# 更新隐藏层和输出层之间的权重self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))# update the weights for the links between the input and hidden layers# 更新输入层和隐藏层之间的权重self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))pass# query the neural network# 查询神经网络def query(self, inputs_list):# convert inputs list to 2d array# 将输入列表转换为2d数组inputs = numpy.array(inputs_list, ndmin=2).T# calculate signals into hidden layer# 计算输入到隐藏层的信号hidden_inputs = numpy.dot(self.wih, inputs)# calculate the signals emerging from hidden layer# 计算从隐藏层输出的信号hidden_outputs = self.activation_function(hidden_inputs)# calculate signals into final output layer# 计算最终输出层的信号final_inputs = numpy.dot(self.who, hidden_outputs)# calculate the signals emerging from final output layer# 计算从最终输出层输出的信号final_outputs = self.activation_function(final_inputs)return final_outputs# backquery the neural network# we'll use the same termnimology to each item, # eg target are the values at the right of the network, albeit used as input# eg hidden_output is the signal to the right of the middle nodes# 反向 查询def backquery(self, targets_list):# transpose the targets list to a vertical array# 将目标列表转置为垂直数组final_outputs = numpy.array(targets_list, ndmin=2).T# calculate the signal into the final output layer# 计算最终输出层的输入信号final_inputs = self.inverse_activation_function(final_outputs)# calculate the signal out of the hidden layer# 计算隐藏层的输出信号hidden_outputs = numpy.dot(self.who.T, final_inputs)# scale them back to 0.01 to .99# 将隐藏层的输出信号缩放到0.01到0.99之间hidden_outputs -= numpy.min(hidden_outputs)hidden_outputs /= numpy.max(hidden_outputs)hidden_outputs *= 0.98hidden_outputs += 0.01# calculate the signal into the hidden layer# 计算隐藏层的输入信号hidden_inputs = self.inverse_activation_function(hidden_outputs)# calculate the signal out of the input layer# 计算输入层的输出信号inputs = numpy.dot(self.wih.T, hidden_inputs)# scale them back to 0.01 to .99# 将输入层的输出信号缩放到0.01到0.99之间inputs -= numpy.min(inputs)inputs /= numpy.max(inputs)inputs *= 0.98inputs += 0.01return inputs

初始化神经网络

# number of input, hidden and output nodes
# 定义网络的输入 隐藏 输出节点数量
input_nodes = 784
hidden_nodes = 200
output_nodes = 10# learning rate
# 学习率
learning_rate = 0.1# create instance of neural network
# 实例化网络
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)

加载数据集

# load the mnist training data CSV file into a list
training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()

训练模型

# train the neural network# epochs is the number of times the training data set is used for training
epochs = 5for e in range(epochs):print("\n epochs------->",e)num = 0# go through all records in the training data setdata_list = len(training_data_list[1:])for record in training_data_list[1:]:# split the record by the ',' commasall_values = record.split(',')# scale and shift the inputsinputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01# create the target output values (all 0.01, except the desired label which is 0.99)targets = numpy.zeros(output_nodes) + 0.01# all_values[0] is the target label for this recordtargets[int(all_values[0])] = 0.99n.train(inputs, targets)num +=1 if num %500==0:print("\r epochs {} 当前进度为 {}".format(e,num/data_list),end="")passpass

输出为:

epochs-------> 0
epochs 0 当前进度为 1.091666666666666744
epochs-------> 1
epochs 1 当前进度为 1.091666666666666744
epochs-------> 2
epochs 2 当前进度为 1.091666666666666744
epochs-------> 3
epochs 3 当前进度为 1.091666666666666744
epochs-------> 4
epochs 4 当前进度为 1.091666666666666744

加载测试数据

# load the mnist test data CSV file into a list
test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()

加载测试数据

# test the neural network# scorecard for how well the network performs, initially empty
scorecard = []# go through all the records in the test data set
for record in test_data_list[1:]:# split the record by the ',' commasall_values = record.split(',')# correct answer is first valuecorrect_label = int(all_values[0])# scale and shift the inputsinputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01# query the networkoutputs = n.query(inputs)# the index of the highest value corresponds to the labellabel = numpy.argmax(outputs)# append correct or incorrect to listif (label == correct_label):# network's answer matches correct answer, add 1 to scorecardscorecard.append(1)else:# network's answer doesn't match correct answer, add 0 to scorecardscorecard.append(0)passpass

计算模型性能

# calculate the performance score, the fraction of correct answers
scorecard_array = numpy.asarray(scorecard)
print ("performance = ", scorecard_array.sum() / scorecard_array.size)
# performance =  0.9737

根据模型反向生成图片

# run the network backwards, given a label, see what image it produces# label to test
label = 0
# create the output signals for this label
targets = numpy.zeros(output_nodes) + 0.01
# all_values[0] is the target label for this record
targets[label] = 0.99
print(targets)# get image data
image_data = n.backquery(targets)# plot image data
matplotlib.pyplot.imshow(image_data.reshape(28,28), cmap='Greys', interpolation='None')

输出为:
在这里插入图片描述

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

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

相关文章

Reactor 模式

目录 1. 实现代码 2. Reactor 模式 3. 分析服务器的实现具体细节 3.1. Connection 结构 3.2. 服务器的成员属性 3.2. 服务器的构造 3.3. 事件轮询 3.4. 事件派发 3.5. 连接事件 3.6. 读事件 3.7. 写事件 3.8. 异常事件 4. 服务器上层的处理 5. Reactor 总结 1…

公钥密码学Public-Key Cryptography

公钥或非对称密码学的发展是整个密码学历史上最伟大的&#xff0c;也许是唯一真正的革命。The development of public-key, or asymmetric, cryptography is the greatest and perhaps the only true revolution in the entire history of cryptography. 公钥算法基于数学函数…

node.js如何实现留言板功能?

一、实现效果如下&#xff1a; 20240422_160404 二、前提配置&#xff1a; 配置&#xff1a;需要安装并且导入underscore模板引擎 安装&#xff1a;在控制台输入npm install underscore -save 文件目录配置&#xff1a; 1》在文件里建一个data文件夹&#xff0c;此文件夹下…

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

【题解】AB5 点击消除(栈)

https://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5?tpId308&tqId40462&ru/exam/oj 把string当栈用&#xff0c;扫一遍就可以了&#xff0c;时间复杂度O(n) #include <iostream> #include <string> using namespace std;int main() {…

向量的点积和叉积的几何意义

1. 点积 点积(dot product)&#xff0c;又称标量积&#xff08;scalar product&#xff09;。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用 2. 叉积 叉积(cross product)&#xff0c;又称为向量积(vector product)。模长等于&#xff0c;方向…

Golang | Leetcode Golang题解之第43题字符串相乘

题目&#xff1a; 题解&#xff1a; func multiply(num1 string, num2 string) string {if num1 "0" || num2 "0" {return "0"}m, n : len(num1), len(num2)ansArr : make([]int, m n)for i : m - 1; i > 0; i-- {x : int(num1[i]) - 0fo…

详细说说,中介怎么做!CLHLS数据库探索抑郁症状的中介作用发文二区

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码&#xff01; 2024年3月28日&#xff0c;中国学者用CLHLS数据库最新数据&#xff08;2018年&#xff…

java-Arrays

一、Arrays的概述 Arrays是操作数组的工具类 二、Arrays的常用方法 Arrays的常用方法基本上都被static静态修饰&#xff0c;因此在使用这些方法时&#xff0c;可以直接通过类名调用 1.toString 语法&#xff1a;Arrays.toString(数组) 用于将数组的元素转换为一个字符串&a…

蓝桥杯第17169题——兽之泪II

问题描述 在蓝桥王国&#xff0c;流传着一个古老的传说&#xff1a;在怪兽谷&#xff0c;有一笔由神圣骑士留下的宝藏。 小蓝是一位年轻而勇敢的冒险家&#xff0c;他决定去寻找宝藏。根据远古卷轴的提示&#xff0c;如果要找到宝藏&#xff0c;那么需要集齐 n 滴兽之泪&#…

Git | 分支管理

Git | 分支管理 文章目录 Git | 分支管理1、理解分支2、创建分支&&切换分支3、合并分支4、删除分支5、合并冲突6、分支管理策略合并分支模式实际工作中分支策略bug分支删除临时分支 1、理解分支 分支就类似分身。 在版本回退中&#xff0c;每次提交Git都会将修改以git…

简单学量化——pandas的应用26——sort_values函数5

简单学量化——pandas的应用26——sort_values函数5 sort_values是pandas中的排序函数&#xff0c;语法如下&#xff1a; DataFrame.sort_values(by,axis0,ascendingTrue,inplaceFalse,kindquicksort,na_positionlast, ignore_indexFalse,keyNone) 前面我们学习了by、axis、a…

C++之写时复制(CopyOnWrite)

设计模式专栏&#xff1a;http://t.csdnimg.cn/4j9Cq 目录 1.简介 2.实现原理 3.QString的实现分析 3.1.内部结构 3.2.写入时复制 4.示例分析 5.使用场景 6.总结 1.简介 CopyOnWrite (COW) 是一种编程思想&#xff0c;用于优化内存使用和提高性能。COW 的基本思想是&am…

go的编译以及运行时环境

开篇 很多语言都有自己的运行时环境&#xff0c;go自然也不例外&#xff0c;那么今天我们就来讲讲go语言的运行时环境&#xff01; 不同语言的运行时环境对比 我们都知道Java的运行时环境是jvm &#xff0c;javascript的运行时环境是浏览器内核 Java -->jvm javascript…

FastWiki一分钟本地离线部署本地企业级人工智能客服

介绍 FastWiki是一个开源的企业级人工智能客服系统&#xff0c;它使用了一系列先进的技术和框架来支持其功能。 技术栈 前端框架&#xff1a;React LobeUI TypeScript后端框架&#xff1a;MasaFramework 基于 .NET 8动态函数&#xff1a;基于JavaScript V8引擎实现向量搜索…

物联网配网工具多元化助力腾飞——智能连接,畅享未来

随着物联网技术的迅猛发展&#xff0c;智能插座、蓝牙网关作为其中常见的智能物联设备&#xff0c;无论是功能还是外观都有很大的改进&#xff0c;在智能化越来越普遍的情况下&#xff0c;它们的应用场景也在不断拓宽。对于智能设备而言&#xff0c;配网方式的选择对于设备的成…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接&#xff1a; Download the latest package 第二步操作方式&#xff1a;打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

【Java框架】SpringMVC(二)——SpringMVC数据交互

目录 前后端数据交互RequestMapping注解基于RequestMapping注解设置接口的请求方式RequestMapping注解的常用属性一个方法配置多个接口method属性params属性headers属性consumes属性produces属性 SpringMVC中的参数传递默认单个简单参数默认多个简单参数默认参数中有基本数据类…

山与路远程控制 一个基于electron和golang实现的远控软件

山与路远程控制 &#x1f3a5;项目演示地址 还在制作… ♻️项目基本介绍 山与路远程控制是基于electron(vue3)和golang实现的远程控制软件(项目界面主要模仿向日葵远程软件,如有侵权请告知),代码可能有点臃肿毕竟只花了一周左右写的无聊项目,如果对其感兴趣的大佬可以fork自…

【JavaScriptThreejs】判断路径在二维平面上投影的方向顺逆时针

原理分析 可以将路径每个连续的两点向量叉乘相加&#xff0c;根据正负性判断路径顺逆时针性 当我们计算两个向量的叉积时&#xff0c;结果是一个新的向量&#xff0c;其方向垂直于这两个向量所在的平面&#xff0c;并且其大小与这两个向量构成的平行四边形的面积成正比。这个新…