宽度学习(BLS)实战——python复刻MNIST数据集的数据预处理及训练过程

article/2025/11/9 22:54:55

目录

1.宽度学习(Broad Learning System)

2.MNIST数据集

3.复刻MNIST数据集的预处理及训练过程


1.宽度学习(Broad Learning System)

对宽度学习的理解可见于这篇博客宽度学习(Broad Learning System)_颹蕭蕭的博客-CSDN博客_宽度学习

这里不再做详细解释

2.MNIST数据集

mnist数据集官网(下载地址):MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

MNIST数据集有称手写体数据集,其中中训练集一共包含了 60,000 张图像和标签,而测试集一共包含了 10,000 张图像和标签。测试集中前5000个来自最初NIST项目的训练集.,后5000个来自最初NIST项目的测试集。前5000个比后5000个要规整,这是因为前5000个数据来自于美国人口普查局的员工,而后5000个来自于大学生。
MNIST数据集自1998年起,被广泛地应用于机器学习和深度学习领域,用来测试算法的效果,相当于该领域的"hello world!"

3.复刻MNIST数据集的预处理及训练过程

原bls代码下载地址:Broad Learning System

下载后,我先用原代码中带的数据和代码进行训练,运行结果如下:

1.不含增量的bls代码:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

2.含有增量的bls代码:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

可以看到bls训练模型的时间非常短并且精确度达到0.93以上

然后我们回过头来看它用的训练集和测试集,它共输入三个csv文件,分别为test.csv,train.csv,sample_submission.csv

其中格式为:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

这就是我们处理完MNIST数据之后需要bls代码中训练的数据,统计得到以下信息

数据集数据总数
test.csv(测试集)28000张
train.csv(训练集)42000张

其中sample_submission.csv是提交样例,它最后会用来保存训练出的模型对测试集打的标签为csv文件。

那么得到这些信息我们就可以开始处理我们的mnist数据集了,在官网下载完数据集后我们得到了四个文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

这个时候如果你是初学者,你就会奇怪明明是图像数据为什么下载完会是这四个东西?

这是因为为了方便使用,官方已经将70000张图片处理之后存入了这四个二进制文件中,因此我们要对这四个文件进行解析才能看到原本的图片。

此处用到struct包进行解析,详情见于Mnist数据集简介_查里王的博客-CSDN博客_mnist数据集

解析代码:

import os
import struct
import numpy as np# 读取标签数据集
with open('../data/train-labels.idx1-ubyte', 'rb') as lbpath:labels_magic, labels_num = struct.unpack('>II', lbpath.read(8))labels = np.fromfile(lbpath, dtype=np.uint8)# 读取图片数据集
with open('../data/train-images.idx3-ubyte', 'rb') as imgpath:images_magic, images_num, rows, cols = struct.unpack('>IIII', imgpath.read(16))images = np.fromfile(imgpath, dtype=np.uint8).reshape(images_num, rows * cols)# 打印数据信息
print('labels_magic is {} \n'.format(labels_magic),'labels_num is {} \n'.format(labels_num),'labels is {} \n'.format(labels))print('images_magic is {} \n'.format(images_magic),'images_num is {} \n'.format(images_num),'rows is {} \n'.format(rows),'cols is {} \n'.format(cols),'images is {} \n'.format(images))# 测试取出一张图片和对应标签
import matplotlib.pyplot as pltchoose_num = 1  # 指定一个编号,你可以修改这里
label = labels[choose_num]
image = images[choose_num].reshape(28, 28)plt.imshow(image)
plt.title('the label is : {}'.format(label))
plt.show()

运行结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

 但是这并不是我们要的东西,我们需要的是将二进制文件解析后存入csv文件中用于训练。

在观察了原代码中所用的csv文件的格式以及bls代码中读取数据的方式后,我发现需要再存入之前对数据添加一个index,其中包括"label"和"pixel0~pixel784",其中pixel是一维数组的元素编码,由于mnist数据集是28*28的图片,所以,转为一维数组后一共有784个元素。

知道这个原理后,编写代码如下:

import csvdef pixel(p_array, outf):with open(outf, "w",newline='') as csvfile:writer = csv.writer(csvfile)# 先写入columns_namewriter.writerow(p_array)def convert(imgf, labelf, outf, n):f = open(imgf, "rb")o = open(outf, "a")l = open(labelf, "rb")f.read(16)l.read(8)images = []for i in range(n):image = [ord(l.read(1))]for j in range(28*28):image.append(ord(f.read(1)))images.append(image)for image in images:o.write(",".join(str(pix) for pix in image)+"\n")f.close()o.close()l.close()if __name__ == '__main__':p_array = []for j in range(0, 785):if j == 0 :b1 = "label"p_array.append(b1)else:b1 = 'pixel' + str(j - 1)p_array.append(b1)pixel(p_array,"../data/mnist_train.csv")pixel(p_array,"../data/mnist_test.csv")convert("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte","../data/mnist_train2.csv", 42000)convert("../data/t10k-images.idx3-ubyte", "../data/t10k-labels.idx1-ubyte","../data/mnist_test2.csv", 28000)print("success!")

代码运行结果;

得到经过二进制文件解析以及格式处理后的数据:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

现在训练集文件格式与源代码格式一样了,但是,既然是复刻那么我们还有一个问题没有解决——数据总数不一样,根据源代码中信息,训练集有42000张,测试集28000张,但是我们的训练集有60000张,测试集有10000张,所以我们需要稍微处理一下我们数量,其实这个很简单,只要将训练集中的数据匀18000张给测试集就可以了,另外测试集中标签一行需要删除,因为测试集好比高考试卷,标签相当于答案,没有人会把高考答案告诉你然后让你考对不对。这个过程可以用python代码实现,只要加入一点点功能,编写功能代码如下:

(记得删除测试集中的标签)

import csv
def test_add(train_imgf,train_labelf,outf):f = open(train_imgf, "rb")o = open(outf, "a")l = open(train_labelf, "rb")f.read(16)l.read(8)images = []for i in range(42001, 60001):image = [ord(l.read(1))]for j in range(28 * 28):image.append(ord(f.read(1)))images.append(image)for image in images:o.write(",".join(str(pix) for pix in image) + "\n")f.close()o.close()l.close()def pixel(p_array, outf):with open(outf, "w",newline='') as csvfile:writer = csv.writer(csvfile)# 先写入columns_namewriter.writerow(p_array)def convert(imgf, labelf, outf, n):f = open(imgf, "rb")o = open(outf, "a")l = open(labelf, "rb")f.read(16)l.read(8)images = []for i in range(n):image = [ord(l.read(1))]for j in range(28*28):image.append(ord(f.read(1)))images.append(image)for image in images:o.write(",".join(str(pix) for pix in image)+"\n")f.close()o.close()l.close()if __name__ == '__main__':p_array = []for j in range(0, 785):if j == 0 :b1 = "label"p_array.append(b1)else:b1 = 'pixel' + str(j - 1)p_array.append(b1)pixel(p_array,"../data/mnist_train2.csv")pixel(p_array,"../data/mnist_test2.csv")convert("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte","../data/mnist_train2.csv", 42000)convert("../data/t10k-images.idx3-ubyte", "../data/t10k-labels.idx1-ubyte","../data/mnist_test2.csv", 10000)test_add("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte", "../data/mnist_test2.csv")print("success!")

处理后,与提交案例一起加入bls训练,可以得到:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5byT5ZCM5a2m,size_20,color_FFFFFF,t_70,g_se,x_16

可以看到这与之前原始数据训练的结果几乎相同

4.补充(bls增量代码)

import numpy as np
import pandas as pd
import datetime
from sklearn import preprocessing  # 用来转化为独热编码
from sklearn.model_selection import train_test_split
from scipy import linalg as LA  # 用来求正交基
import joblib# 在第一次求权重时,并未使用岭回归,还是直接求了伪逆,对于小型数据集这种方法足够了def show_accuracy(predictLabel, Label):Label = np.ravel(Label).tolist()predictLabel = predictLabel.tolist()count = 0for i in range(len(Label)):if Label[i] == predictLabel[i]:count += 1return (round(count / len(Label), 5))class node_generator(object):def __init__(self, isenhance=False):self.Wlist = []self.blist = []self.function_num = 0self.isenhance = isenhancedef sigmoid(self, x):return 1.0 / (1 + np.exp(-x))def relu(self, x):return np.maximum(x, 0)def tanh(self, x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))def linear(self, x):return xdef generator(self, shape, times):# times是多少组mapping nodesfor i in range(times):W = 2 * np.random.random(size=shape) - 1if self.isenhance == True:W = LA.orth(W)  # 求正交基,只在增强层使用。也就是原始输入X变成mapping nodes的W和mapping nodes变成enhancement nodes的W要正交b = 2 * np.random.random() - 1yield (W, b)def generator_nodes(self, data, times, batchsize, function_num):# 按照bls的理论,mapping layer是输入乘以不同的权重加上不同的偏差之后得到的# 若干组,所以,权重是一个列表,每一个元素可作为权重与输入相乘self.Wlist = [elem[0] for elem in self.generator((data.shape[1], batchsize), times)]self.blist = [elem[1] for elem in self.generator((data.shape[1], batchsize), times)]self.function_num = {'linear': self.linear,'sigmoid': self.sigmoid,'tanh': self.tanh,'relu': self.relu}[function_num]  # 激活函数供不同的层选择# 下面就是先得到一组mapping nodes,再不断叠加,得到len(Wlist)组mapping nodesnodes = self.function_num(data.dot(self.Wlist[0]) + self.blist[0])for i in range(1, len(self.Wlist)):nodes = np.column_stack((nodes, self.function_num(data.dot(self.Wlist[i]) + self.blist[i])))return nodesdef transform(self, testdata):testnodes = self.function_num(testdata.dot(self.Wlist[0]) + self.blist[0])for i in range(1, len(self.Wlist)):testnodes = np.column_stack((testnodes, self.function_num(testdata.dot(self.Wlist[i]) + self.blist[i])))return testnodesdef update(self, otherW, otherb):# 权重更新self.Wlist += otherWself.blist += otherbclass scaler:def __init__(self):self._mean = 0self._std = 0def fit_transform(self, traindata):self._mean = traindata.mean(axis=0)self._std = traindata.std(axis=0)return (traindata - self._mean) / (self._std + 0.001)def transform(self, testdata):return (testdata - self._mean) / (self._std + 0.001)class broadNet(object):def __init__(self, map_num=10, enhance_num=10, DESIRED_ACC=0.99, EPOCH=10, STEP=1, map_function='linear',enhance_function='linear', batchsize='auto'):self.map_num = map_num  # 多少组mapping nodesself.enhance_num = enhance_num  # 多少组engance nodesself.batchsize = batchsizeself.map_function = map_functionself.enhance_function = enhance_functionself.DESIRED_ACC = DESIRED_ACCself.EPOCH = EPOCHself.STEP = STEPself.W = 0self.pseudoinverse = 0self.normalscaler = scaler()self.onehotencoder = preprocessing.OneHotEncoder(sparse=False)self.mapping_generator = node_generator()self.enhance_generator = node_generator(isenhance=True)def fit(self, data, label):if self.batchsize == 'auto':self.batchsize = data.shape[1]data = self.normalscaler.fit_transform(data)label = self.onehotencoder.fit_transform(np.mat(label).T)mappingdata = self.mapping_generator.generator_nodes(data, self.map_num, self.batchsize, self.map_function)enhancedata = self.enhance_generator.generator_nodes(mappingdata, self.enhance_num, self.batchsize,self.enhance_function)print('number of mapping nodes {0}, number of enhence nodes {1}'.format(mappingdata.shape[1],enhancedata.shape[1]))print('mapping nodes maxvalue {0} minvalue {1} '.format(round(np.max(mappingdata), 5),round(np.min(mappingdata), 5)))print('enhence nodes maxvalue {0} minvalue {1} '.format(round(np.max(enhancedata), 5),round(np.min(enhancedata), 5)))inputdata = np.column_stack((mappingdata, enhancedata))print('input shape ', inputdata.shape)# 求伪逆self.pseudoinverse = np.linalg.pinv(inputdata)# 新的输入到输出的权重print('pseudoinverse shape:', self.pseudoinverse.shape)self.W = self.pseudoinverse.dot(label)# 查看当前的准确率Y = self.predict(data)accuracy = self.accuracy(Y, label)print("inital setting, number of mapping nodes {0}, number of enhence nodes {1}, accuracy {2}".format(mappingdata.shape[1], enhancedata.shape[1], round(accuracy, 5)))# 如果准确率达不到要求并且训练次数小于设定次数,重复添加enhance_nodesepoch_now = 0while accuracy < self.DESIRED_ACC and epoch_now < self.EPOCH:Y = self.addingenhance_predict(data, label, self.STEP, self.batchsize)accuracy = self.accuracy(Y, label)epoch_now += 1print("enhencing {3}, number of mapping nodes {0}, number of enhence nodes {1}, accuracy {2}".format(len(self.mapping_generator.Wlist) * self.batchsize,len(self.enhance_generator.Wlist) * self.batchsize,round(accuracy, 5),epoch_now))def decode(self, Y_onehot):Y = []for i in range(Y_onehot.shape[0]):lis = np.ravel(Y_onehot[i, :]).tolist()Y.append(lis.index(max(lis)))return np.array(Y)def accuracy(self, predictlabel, label):# print('predictlabel shape', predictlabel.shape)bbb# print('label shape:', label.shape)labels = []for i in range(len(label)):labels.append(np.argmax(label[i]))labels = np.ravel(labels).tolist()predictlabel = predictlabel.tolist()count = 0for i in range(len(labels)):if labels[i] == predictlabel[i]:count += 1return (round(count / len(labels), 5))def predict(self, testdata):# print(self.W.shape)testdata = self.normalscaler.transform(testdata)test_inputdata = self.transform(testdata)return self.decode(test_inputdata.dot(self.W))def transform(self, data):mappingdata = self.mapping_generator.transform(data)enhancedata = self.enhance_generator.transform(mappingdata)return np.column_stack((mappingdata, enhancedata))def addingenhance_nodes(self, data, label, step=1, batchsize='auto'):if batchsize == 'auto':batchsize = data.shape[1]mappingdata = self.mapping_generator.transform(data)inputdata = self.transform(data)localenhance_generator = node_generator()extraenhance_nodes = localenhance_generator.generator_nodes(mappingdata, step, batchsize, self.enhance_function)D = self.pseudoinverse.dot(extraenhance_nodes)C = extraenhance_nodes - inputdata.dot(D)BT = np.linalg.pinv(C) if (C == 0).any() else np.mat((D.T.dot(D) + np.eye(D.shape[1]))).I.dot(D.T).dot(self.pseudoinverse)self.W = np.row_stack((self.W - D.dot(BT).dot(label), BT.dot(label)))self.enhance_generator.update(localenhance_generator.Wlist, localenhance_generator.blist)self.pseudoinverse = np.row_stack((self.pseudoinverse - D.dot(BT), BT))def addingenhance_predict(self, data, label, step=1, batchsize='auto'):self.addingenhance_nodes(data, label, step, batchsize)test_inputdata = self.transform(data)return self.decode(test_inputdata.dot(self.W))if __name__ == '__main__':# load the datatrain_data = pd.read_csv('../train.csv')test_data = pd.read_csv('../test.csv')samples_data = pd.read_csv('../sample_submission.csv')label = train_data['label'].valuesdata = train_data.drop('label', axis=1)data = data.valuesprint(data.shape, max(label) + 1)traindata, valdata, trainlabel, vallabel = train_test_split(data, label, test_size=0.2, random_state=0)print(traindata.shape, trainlabel.shape, valdata.shape, vallabel.shape)bls = broadNet(map_num=20,  # 初始时多少组mapping nodesenhance_num=20,  # 初始时多少enhancement nodesEPOCH=20,  # 训练多少轮map_function='sigmoid',enhance_function='sigmoid',batchsize=200,  # 每一组的神经元个数DESIRED_ACC=0.95,  # 期望达到的准确率STEP=10 # 一次增加多少组enhancement nodes)starttime = datetime.datetime.now()bls.fit(traindata, trainlabel)endtime = datetime.datetime.now()joblib.dump(bls, "model_allin.pkl")print('the training time of BLS is {0} seconds'.format((endtime - starttime).total_seconds()))predictlabel = bls.predict(valdata)print(show_accuracy(predictlabel, vallabel))predicts = bls.predict(test_data)# save as csv filesamples = samples_data['ImageId']result = {'ImageId': samples,'Label': predicts}result = pd.DataFrame(result)result.to_csv('../output/bls_addenhancenodes.csv', index=False)


http://chatgpt.dhexx.cn/article/xbKFkGcK.shtml

相关文章

《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

本博实时更新《Linux设备驱动开发详解(第3版)》的最新进展。 目前已经完成稿件。 2015年8月9日&#xff0c;china-pub开始上线预售&#xff1a; http://product.china-pub.com/4733972 2015年8月20日&#xff0c;各路朋友报喜说已经拿到了书。 本书已经rebase到开发中的Linu…

linux_设备驱动_设备树

一.什么是DTS&#xff1f;为什么要引入DTS&#xff1f; DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构&#xff0c;它起源于 OpenFirmware (OF)。 在Linux 2.6中&#xff0c;ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/ma…

Linux设备驱动模型(一)

一、sysfs文件系统 sysfs是一个虚拟文件系统&#xff0c;将内核总的设备对象的链接关系&#xff0c;以文件目录的方式表示出来&#xff0c;并提对设备提供读写接口。 二、kobject kobject是内核中对象表示的基类&#xff0c;可以认为所有的内核对象都是一个kobject kobject单…

Linux设备驱动基础03:Linux字符设备驱动

1 Linux文件系统与设备驱动 1.1 文件系统与设备驱动之间的关系 Linux中文件系统与设备驱动程序之间的关系如下图所示&#xff0c; 应用程序和VFS之间的接口是系统调用&#xff1b;VFS和文件系统以及设备文件之间的接口是file_operations结构体中的成员函数&#xff0c;该结构体…

Linux 设备驱动程序(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xff09; Linux 设备驱动程序&#xff08;四&#xff09; Linux设备驱动开发详解 …

Linux驱动——字符设备驱动

目录 一、代码编译环境 二、Linux驱动开发分类 三、字符设备驱动开发流程 1.编译驱动模块代码&#xff08;Makefile&#xff09; 2.驱动模块的加载与卸载 四、字符设备驱动编写 1.驱动模块 2. 字符设备驱动编写步骤 2.1 设备号的注册与注销 2.2 设备节点的注册与注销 …

【Linux设备驱动】设备驱动分类

Linux设备驱动分类 驱动分为有操作系统设备驱动和误操作系统的设备驱动。 有无操作系统设备驱动 无操作系统设备驱动 不是所有的计算机系统都一定要有操作系统&#xff0c;在许多情况下&#xff0c;操作系统都是不必存在的。对于功能比较单一、控制不复杂的系统&#xff0c…

Linux-设备驱动概述

文章目录 Linux设备驱动概述1. 设备驱动的作用2. 无操作系统的设备驱动3. 有操作系统时的设备驱动4. Linux设备驱动4.1 设备的分类及特点4.2 Linux设备驱动与整个软硬件系统的关系4.3 Linux设备驱动的重难点 5. 源代码阅读6. 设备驱动&#xff1a;LED驱动6.1 无操作系统的LED驱…

Linux设备驱动和设备匹配过程

Linux设备驱动和设备匹配过程 1. 设备驱动匹配简述2. 重点结构体介绍2.1 struct device2.2 struct platform_device2.3 struct platform_driver2.4 struct device_driver 3. device端发起匹配&#xff1a;3.1 流程图3.2 start_kernel时候解析设备树3.2.1 start_kernel3.2.2 set…

Linux设备驱动之字符设备驱动

一、linux系统将设备分为3类&#xff1a;字符设备、块设备、网络设备。 应用程序调用的流程框图&#xff1a; 三种设备的定义分别如下&#xff0c; 字符设备&#xff1a;只能一个字节一个字节的读写的设备&#xff0c;不能随机读取设备内存中的某一数据&#xff0c;读取数据需…

Linux设备驱动基础01:Linux设备驱动概述

目录 1. 设备驱动的作用 2. 有无操作系统时的设备驱动 2.1 无操作系统 2.1.1 硬件、驱动和应用程序的关系 2.1.2 单任务软件典型架构 2.2 有操作系统 2.2.1 硬件、驱动、操作系统和应用软件的关系 3. Linux设备分类 3.1 常规分类法 3.1.1 字符设备 3.1.2 块设备 3.…

Linux设备驱动模型

目录 一、linux设备驱动模型简介1、什么是设备驱动模型2、为什么需要设备驱动模型3、驱动开发的2个点 二、设备驱动模型的底层架构1、kobject2、kobj_type3、kset 三、总线式设备驱动组织方式1、总线2、设备3、驱动4、类5、总结 四、platform平台总线工作原理1、何为平台总线2、…

【linux内核分析与应用-陈莉君】字符设备驱动

目录 1.什么是字符设备 2.如何来描述字符设备 3 struct cdev与const struct file_operations之间的关系 4.struct file_operations源码 5.字符设备驱动框架 6.编写字符设备驱动的步骤 7.字符设备结构 8.字符设备驱动程序的注册 9.从系统调用到驱动程序 10.用户空间与内…

微信小程序云数据库使用讲解

第一步&#xff1a;注册开通 单击云开发 第二步&#xff1a;创建数据库 选择数据库&#xff0c;并点击号创建一个集合 输入名字 创建完毕后点击添加记录即可添加数据 数据库获取&#xff1a; 查询&#xff1a; 查询指令&#xff1a;

微信小程序云开发入门-数据库插入数据(包含批量)

一、前言 文章将介绍如何在微信小程序云开发中向云开发数据库插入数据&#xff08;单条或批量&#xff09;。 写法有好几种&#xff0c;文章将会一一进行对比&#xff0c;看看每种写法之间有何优缺点&#xff0c;如何让代码看起来更优雅。 为了更加贴合实际的开发逻辑&#xf…

【微信小程序】如何获取微信小程序云开发数据库的数据并渲染到页面?

前言 上一篇博客我把微信小程序云开发数据库操作&#xff08;增删改查&#xff09;的实现方法都已经分享出来啦&#xff0c;可以戳链接进去阅读哦 【微信小程序】小程序云开发实现数据库增删改查(小白速度Get起来&#xff01;&#xff01;一步步教你如何实现) 基于微信小程序…

开发一个可以查询并显示数据库内容的微信小程序

使用微信开发者工具可以创建云数据库&#xff0c;并通过代码可以查询并在客户端显示数据库的内容。 附&#xff1a;小程序一个功能页面有wxml(客户端呈现)&#xff0c;js(功能函数)&#xff0c;json&#xff0c;wxss(个性化处理)&#xff0c;这些是局部的文件。还有全局的文件如…

微信小程序开发---连接云开发数据库,实现数据获取

之前几篇博客里面都详细交代了如何配置云函数&#xff0c;现在就讲一下关于云函数中数据库的使用&#xff0c;主要是讲如何从云开发平台的数据库中调取数据 我们直接来到需要调用数据库数据的页面的js文件&#xff0c;直接设置全局变量&#xff0c;来便于后续调用数据库 const …

微信小程序查询数据库

微信小程序云开发的官方例子&#xff1a; const db wx.cloud.database() //获取数据库的引用 const _ db.command //获取数据库查询及更新指令 db.collection("china") //获取集合china的引用.where({ //查询的条件指令wheregdp: _.gt(3000) …

微信小程序云数据库操作

微信小程序云数据库操作 1、云数据库简介1.1 数据类型Date地理位置Null 1.2 权限控制 2、云数据库操作2.1 查询数据2.1.1 通过collection.doc获取一条记录2.1.2 通过collection.get获取所有记录的数据2.1.3 通过document.get获取某一条记录的数据2.1.4 通过collection.count获取…