当前位置: 首页 > news >正文

记5(一元逻辑回归+线性分类器+多元逻辑回归

目录

  • 1、一元逻辑回归
  • 2、线性可分&线性不可分
  • 3、Iris数据集实现多元逻辑回归
  • 4、绘制分类图
  • 5、鸢尾花分类图
  • 6、多分类问题:(softmax回归)
    • 6.1、编码:自然顺序码、独热编码、独冷编码
    • 6.2、二/多分类问题:
    • 6.3、softmax回归:
    • 6.4、(非)互斥的多分类问题:

1、一元逻辑回归

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#x是商品房面积,y是对应的商品房类型
x=np.array([137.97,104.50,100.00,126.32,79.20,99.00,124.00,114.00,106.69,140.05,53.75,46.91,68.00,63.02,81.26,86.21])
y=np.array([1,1,0,1,0,1,1,0,0,1,0,0,0,0,0,0])
#plt.scatter(x,y)  #可以看到横坐标面积都是大于40的正数
x_train=x-np.mean(x)        #因为sigmoid函数是以0点为中心的,所以需要中心化
y_train=y
#plt.scatter(x,y)learn_rate=0.005        #超参数
iter=5
display_step=1          #显示间隔np.random.seed(612)
w=tf.Variable(np.random.randn())
b=tf.Variable(np.random.randn())
cross_train=[]           #存放训练集的交叉熵损失
acc_train=[]             #存放训练集的分类准确率plt.scatter(x_train,y_train)
x_=range(-80,80)
y_=1/(1+tf.exp(-(w*x_+b)))
plt.plot(x_,y_,color="red",linewidth=3) #绘制使用初始的w、b值时的sigmoid函数曲线,此时w<0,b<0for i in range(0,iter+1):with tf.GradientTape() as tape:#Sigmoid函数pred_train=1/(1+tf.exp(-(w*x_train+b)))#交叉熵损失函数Loss_train=-tf.reduce_mean(y_train*tf.math.log(pred_train)+(1-y_train)*tf.math.log(1-pred_train))#准确率Accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.where(pred_train<0.5,0,1),y_train),tf.float32))cross_train.append(Loss_train)acc_train.append(Accuracy_train)dL_dw,dL_db=tape.gradient(Loss_train, [w,b])w.assign_sub(learn_rate*dL_dw)b.assign_sub(learn_rate*dL_db)if i%display_step==0:print("i:%i,Train Loss:%f, Accuracy:%f" %(i,Loss_train,Accuracy_train))y_=1/(1+tf.exp(-(w*x_+b)))plt.plot(x_,y_)     #绘制每次间隔后,当前权值的sigmoid曲线

在这里插入图片描述
训练测试数据(不是测试集,因为是数据无标签)及其可视化:

x_test=[128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00,162.00,114.60]
pred_test=1/(1+tf.exp(-(w*(x_test-np.mean(x))+b)))
y_test=tf.where(pred_test<0.5,0,1)
for i in range(len(x_test)):print(x_test[i],"\t",pred_test[i].numpy(),"\t",y_test[i].numpy(),"\t")
#测试集数据的可视化
plt.scatter(x_test,y_test)
y_=1/(1+tf.exp(-(w*x_+b)))
plt.plot(x_+np.mean(x),y_)
plt.show()
#输出:
128.15 	 0.8610252 	 1 	
45.0 	 0.0029561974 	 0 	
141.43 	 0.9545566 	 1 	
106.27 	 0.45318928 	 0 	
99.0 	 0.2981362 	 0 	
53.84 	 0.00663888 	 0 	
85.36 	 0.108105935 	 0 	
70.0 	 0.028681064 	 0 	
162.0 	 0.9928677 	 1 	
114.6 	 0.6406205 	 1 

在这里插入图片描述

2、线性可分&线性不可分

  • 线性可分:通过一条直线分开
    与或非都是线性可分,异或线性不可分:
    在这里插入图片描述
  • 线性分类器
    在这里插入图片描述
  • 线性不可分:无法通过一条直线分开(但可以是2条直线或1条曲线)

3、Iris数据集实现多元逻辑回归

属性选取花萼长度、宽度;标签选山鸢尾(Setosa)、变色鸢尾(Virginica),

线性分类器:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
plt.rcParams["font.family"] = "SimHei"
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
#读取文件,详见Python笔记10
train_path=tf.keras.utils.get_file("iris.csv", origin=None)   #获取文件的绝对路径
df_iris=pd.read_csv(train_path,header=0)        #结果是panda的二维数据表
iris=np.array(df_iris)        #将二维数据表类型转化为二维数组类型,shape=(150,6),与视频中不一样,索引号为0的是序号
x=iris[:,1:3]         #索引号1、2列属性:花瓣长度和宽度,x.shape=(150, 2)
y=iris[:,5]          #train_y.shape=(150,)x_sv=np.concatenate((np.stack(x[y=='setosa']),  #选取2种花,共100条数据,以及其前2种属性np.stack(x[y=='versicolor'])),axis=0)
y_sv=np.concatenate((np.zeros(np.where(y=='setosa')[0].size),   #元组只有一个元素(数组)np.ones(np.where(y=='versicolor')[0].size)),axis=0)np.random.seed(612)
iris_rand=np.concatenate((x_sv,np.expand_dims(y_sv,axis=1)),axis=1)
np.random.shuffle(iris_rand)        #打乱数组,并选前面78条数据为训练集,后面22条做测试集
x_train=iris_rand[:78,0:2]
y_train=iris_rand[:78,2]
x_test=iris_rand[78:,0:2]
y_test=iris_rand[78:,2]#训练前的可视化
cm_pt=mpl.colors.ListedColormap(["blue","red"])     #自定义颜色集合(蓝色,红色)
#plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt) 
#plt.show()  #横坐标花萼长度,纵坐标花萼宽度,蓝色'setosa',红色'versicolor',尺度相同不用归一化x_train=x_train-np.mean(x_train,axis=0)     #中心化
x_test=x_test-np.mean(x_test,axis=0)        #中心化
# plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt) 
# plt.show()x0_train=np.ones(len(x_train)).reshape(-1,1)    #见机器学习笔记4——多元线性回归,一样的
X_train=tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32)  #X.shape=TensorShape([78, 3])
Y_train=tf.constant(y_train.reshape(-1,1),tf.float32)             #Y.shape=TensorShape([78, 1])x0_test=np.ones(len(x_test)).reshape(-1,1)    #见上面训练集,一样的
X_test=tf.cast(tf.concat([x0_test,x_test],axis=1),tf.float32)  #X.shape=TensorShape([22, 3])
Y_test=tf.constant(y_test.reshape(-1,1),tf.float32)             #Y.shape=TensorShape([22, 1])learn_rate=0.2                                  #超参数——学习率
iter=120                                         #迭代次数
display_step=30                                 #设置每迭代10次输出结果,方便查看
np.random.seed(615)
W=tf.Variable(np.random.randn(3,1),dtype=tf.float32)    #W列向量,3行1列
ce_train=[]       #保存交叉熵损失
ce_test=[]
acc_train=[]      #保存准确率
acc_test=[]
#训练模型
for i in range(0,iter+1):with tf.GradientTape() as tape:#Sigmoid函数,PRED是列向量,是每个样品的预测概率PRED_train=1/(1+tf.exp(-tf.matmul(X_train,W)))PRED_test=1/(1+tf.exp(-tf.matmul(X_test,W)))#交叉熵损失函数Loss_train=-tf.reduce_mean(Y_train*tf.math.log(PRED_train)+(1-Y_train)*tf.math.log(1-PRED_train))Loss_test=-tf.reduce_mean(Y_test*tf.math.log(PRED_test)+(1-Y_test)*tf.math.log(1-PRED_test))#准确率,训练集:将预测值PRED_train二值化,并与真实值Y_train比较Accuracy_train=tf.reduce_mean(tf.cast(tf.equal(tf.where(PRED_train.numpy()<0.5,0.,1.),Y_train),tf.float32))Accuracy_test=tf.reduce_mean(tf.cast(tf.equal(tf.where(PRED_test.numpy()<0.5,0.,1.),Y_test),tf.float32))    ce_train.append(Loss_train)ce_test.append(Loss_test)acc_train.append(Accuracy_train)acc_test.append(Accuracy_test)#只使用训练集来更新参数dL_dW=tape.gradient(Loss_train, W)W.assign_sub(learn_rate*dL_dW)if i%display_step==0:print("i:%i,\tTrainAcc:%f,TrainLoss:%f\tTestAcc:%f,TestLoss:%f" %(i,Accuracy_train,Loss_train,Accuracy_test,Loss_test))#可视化,
plt.figure(figsize=(8,8))
#绘制损失和准确率的变化曲线
plt.subplot(221)
plt.plot(ce_train,color="blue",label="Train Loss")
plt.plot(acc_train,color="red",label="Train Acc")
plt.legend()
plt.subplot(223)
plt.plot(ce_test,color="blue",label="Test Loss")
plt.plot(acc_test,color="red",label="Test Acc")
plt.legend()
#绘制散点图、决策边界
plt.subplot(222)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)
x_=[-1.5,1.5]
y_=-(W[1]*x_+W[0])/W[2]
plt.plot(x_,y_,color='g')
plt.subplot(224)
plt.scatter(x_test[:,0],x_test[:,1],c=y_test,cmap=cm_pt)
plt.plot(x_,y_,color='g')
plt.suptitle("训练集(上)&测试集(下)")
plt.show()

输出:

i:0,	TrainAcc:0.474359,TrainLoss:0.887229	TestAcc:0.409091,TestLoss:0.854671
i:30,	TrainAcc:0.846154,TrainLoss:0.464031	TestAcc:0.818182,TestLoss:0.448182
i:60,	TrainAcc:0.961538,TrainLoss:0.317919	TestAcc:0.909091,TestLoss:0.318348
i:90,	TrainAcc:0.987179,TrainLoss:0.244545	TestAcc:0.909091,TestLoss:0.256466
i:120,	TrainAcc:1.000000,TrainLoss:0.200362	TestAcc:0.909091,TestLoss:0.220343

在这里插入图片描述

4、绘制分类图

生成网格坐标矩阵:np.meshgrid()
填充网格:plt.pcolomesh()

import numpy as np
import matplotlib.pyplot as plt
n=10
x=np.linspace(-10,10,n)    #生成等差数列
y=np.linspace(-10,10,n)
X,Y=np.meshgrid(x,y)
Z=X+Y
plt.pcolormesh(X,Y,Z,cmap="rainbow")    #X是横坐标,Y是纵坐标,Z来控制颜色,cmap颜色方案
plt.show()

在这里插入图片描述
也可以自定义颜色序列

  • 绘制轮廓线:plt.contour()、plt.contourf()
  • 自定义颜色方案:cm=mpl.colors.ListedColormap([“#FFA0A0”,“red”])
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
n=200
x=np.linspace(-10,10,n)         #生成等差数列
y=np.linspace(-10,10,n)
X,Y=np.meshgrid(x,y)
Z=X+Y
#Z=tf.where(Z<0,0,1)   #也可以用这个函数来设置阈值划分颜色
plt.figure(figsize=(6,6))
#2种颜色
plt.subplot(221)
cm_bg1=mpl.colors.ListedColormap(["#FFA0A0","#A0FFA2"])#注意有中括号[]
plt.pcolormesh(X,Y,Z,cmap=cm_bg1)    #用Z来控制颜色
#3种颜色
plt.subplot(222)
cm_bg2=mpl.colors.ListedColormap(["#FFA0A0","#A0FFA2","#AA5555"])
plt.pcolormesh(X,Y,Z,cmap=cm_bg2)    #用Z来控制颜色,均分为3种颜色
#绘制轮廓图
plt.subplot(223)
Z=X**2+Y**2
plt.contour(X,Y,Z,cmap="rainbow")    #用Z来控制颜色,每一条线上的取值相同,理解为等高线
#绘制轮廓并填充
plt.subplot(224)
plt.contourf(X,Y,Z,cmap="rainbow")
plt.show()

在这里插入图片描述

5、鸢尾花分类图

x_train的数值见上面“Iris数据集实现多元逻辑回归”代码

#绘制分类图
M=300
x1_min,x2_min=x_train.min(axis=0)   #算出训练集中花萼长度x1、花萼宽度x2的最大值最小值
x1_max,x2_max=x_train.max(axis=0)
m1,m2=np.meshgrid(np.linspace(x1_min,x1_max,M),     #绘制网格,x1横坐标,x2纵坐标np.linspace(x2_min,x2_max,M))     #linspace创建等差数列M是元素个数
X_mesh=tf.cast(np.stack((np.ones(M*M),m1.reshape(-1),m2.reshape(-1)),axis=1),dtype=tf.float32)   #生成多元线性回归需要的矩阵,shape=(90000, 3),并转化为浮点数类型
Y_mesh=tf.cast(1/(1+tf.exp(-tf.matmul(X_mesh,W))),dtype=tf.float32)
Y_mesh=tf.where(Y_mesh<0.5,0,1)     #0,1作为背景颜色填充的依据
n=tf.reshape(Y_mesh,m1.shape)       #维度变换,使Y_mesh与m1有相同形状
cm_pt=mpl.colors.ListedColormap(["blue","red"])     #散点图颜色方案
cm_bg=mpl.colors.ListedColormap(["#FFA022","#A0F111"])#背景颜色方案
plt.pcolormesh(m1,m2,n,cmap=cm_bg)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=cm_pt)

在这里插入图片描述

6、多分类问题:(softmax回归)

6.1、编码:自然顺序码、独热编码、独冷编码

  • 自然顺序码转化为独热编码:tf.one_hot(indices,depth) indices是一个整数,depth是深度
  • 依次是用一个数字、一个向量(独热是1,独冷是0)表示一个类别
    在这里插入图片描述

6.2、二/多分类问题:

  • 二分类问题:输入的x1、x2是样品的2个特征,令x0=1,因此,可以看成是输入3个特征,w0表示偏置项,通过sigmoid函数转化为一个0~1之间的概率值,逻辑回归
  • 多分类问题:样品的标记常常表示为独热编码的形式,如下图(0 0 1)^T,其中红色框里面的向量是对应标记的概率,softmax回归
    在这里插入图片描述
  • 交叉熵损失函数:
    二分类问题:二元交叉熵损失函数(BCE);多分类问题:多元交叉熵损失函数(CCE):
    在这里插入图片描述
    如下模型中A、B的准确率一样,但是A中那个预测错的比较离谱,计算知道A交叉熵损失较大:

在这里插入图片描述

6.3、softmax回归:

  • tf.nn.softmax()
  • 如下图,使得输入序列中较大的数在输出中的概率更大。这也是广义线性回归的一种,用来完成分类任务
    在这里插入图片描述
  • 例如鸢尾花数据集有4个属性,加上偏置项x0,输出有3个标签,so,模型参数矩阵W是5行3列
    在这里插入图片描述

6.4、(非)互斥的多分类问题:

  • 互斥的多分类问题:手写数字识别、鸢尾花识别、…
  • 非互斥的多分类问题:包含人物的图片与包含汽车的图片识别、…

相关文章:

记5(一元逻辑回归+线性分类器+多元逻辑回归

目录 1、一元逻辑回归2、线性可分&线性不可分3、Iris数据集实现多元逻辑回归4、绘制分类图5、鸢尾花分类图6、多分类问题&#xff1a;&#xff08;softmax回归&#xff09;6.1、编码&#xff1a;自然顺序码、独热编码、独冷编码6.2、二/多分类问题&#xff1a;6.3、softmax…...

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...

Nginx 运维开发高频面试题详解

一、基础核心问题 原文链接&#xff1a;https://blog.csdn.net/weixin_51146329/article/details/142963853 1、什么是Nginx&#xff1f; Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级和高并发处理能力而闻名。Nginx 的反向代理功能允许它作为前端服务…...

下载OpenJDK

由于Oracle需要付费&#xff0c;并且之前我在寻找openJDK的时候&#xff0c;我不知道网址&#xff0c;并且也不知道在这个openjdk这个网址里点击哪个模块进行下载。最近我在看虚拟机相关的书籍的时候&#xff0c;找到了相关的网址。 注意&#xff1a;下面的下载都是基于可以科…...

Web3.js详解

Web1&Web2&Web3 以下是Web1、Web2和Web3的详细介绍&#xff0c;以及一个对比表格&#xff1a; Web1 定义&#xff1a;Web1指的是有着固定内容的非许可的开源网络。特点&#xff1a;在Web1时代&#xff0c;网站内容主要由网站管理员或创建者提供&#xff0c;用户只能…...

学习串行通信

本文来源&#xff1a; [8-1] 串口通信_哔哩哔哩_bilibili 智谱清言 ------------ 串口&#xff08;Serial Port&#xff09;&#xff1a; 串口是一种应用非常广泛的通讯接口&#xff0c;串口成本低&#xff0c;容易使用&#xff0c;通信线路简单&#xff0c;可实现两个设…...

【leetcode强化练习·二叉树】同时运用两种思维解题

本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解&#xff0c;你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树&#xff0c;…...

Rank-analysis-1.2——一款基于LCU API的排位分析工具,大四学生独立开发

LOL Rank Record Analysis&#xff1a;一款基于LCU API的排位分析工具&#xff0c;大四学生独立开发&#xff01; 大家好&#xff01;我是河南科技学院的大四学生&#xff0c;今天给大家分享一个我自己开发的软件——LOL Rank Record Analysis。这是一个基于 Riot 提供的 LCU …...

什么是门控循环单元?

一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…...

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…...

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制

内容概要 在当前快速发展的城市环境中&#xff0c;智慧园区综合管理系统正在成为各类园区管理的重要工具&#xff0c;无论是工业园、产业园、物流园&#xff0c;还是写字楼与公寓&#xff0c;都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统&#xff0c;用…...

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙

目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)

目录 协议层设计&#xff0c;以IIC为例子 关于软硬件IIC 设计的一些原则 完成协议层的抽象 刨析我们的原理 如何完成我们的抽象 插入几个C语言小技巧 完成软件IIC通信 开始我们的IIC通信 结束我们的IIC通信 发送一个字节 &#xff08;重要&#xff09;完成命令传递和…...

Mac M1 源码安装FFmpeg,开启enable-gpl 和 lib x264

1、第一步&#xff1a;下载并安装minicoda curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.shsh Miniconda3-latest-MacOSX-arm64.sh2、第二步&#xff1a;安装必要的依赖 conda install -c conda-forge gcc make nasm yasm3、第三步&#xff…...

【Quest开发】手柄单手抓握和双手抓握物体切换

V72更新以后非常智能哈&#xff0c;配置物体简单多了。 选择需要被抓取的物体鼠标右键单击它&#xff0c;点Add Grab Interaction&#xff0c;按它要求的配置就行 配好以后长这样 把这个选项取消勾选就能切换成双手抓一个物体了&#xff0c;不需要像以前一样用各种grabTransfo…...

DB-GPT试用

继续上一篇 DB-GPT的安装 https://blog.csdn.net/berryreload/article/details/142845190 访问http://xxx:5670 访问这里 创建数据库连接 http://10.168.1.208:5670/construct/database 访问这里&#xff0c;点击刷新 http://10.168.1.208:5670/construct/app 刷新后才能出…...

​《Ollama Python 库​》

Ollama Python 库 Ollama Python 库提供了将 Python 3.8 项目与 Ollama 集成的最简单方法。 先决条件 应该安装并运行 Ollama拉取一个模型以与库一起使用&#xff1a;例如ollama pull <model>ollama pull llama3.2 有关可用模型的更多信息&#xff0c;请参阅 Ollama.com。…...

Java的Integer缓存池

Java的Integer缓冲池&#xff1f; Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围&#xff0c;因此缓存这些对象可以减少内存分配和垃圾回收的负担&#xff0c;提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...

Ubuntu16.04编译安装Cartographer 1.0版本

说明 官方文档 由于Ubuntu16.04已经是很老的系统&#xff0c;如果直接按照Cartographer官方安装文档安装会出现代码编译失败的问题&#xff0c;本文给出了解决这些问题的办法。正常情况下执行本文给出的安装方法即可成功安装。 依赖安装 # 这里和官方一致 # Install the req…...

Qt调用FFmpeg库实时播放UDP组播视频流

基于以下参考链接&#xff0c;通过改进实现实时播放UDP组播视频流 https://blog.csdn.net/u012532263/article/details/102736700 源码在windows&#xff08;qt-opensource-windows-x86-5.12.9.exe&#xff09;、ubuntu20.04.6(x64)(qt-opensource-linux-x64-5.12.12.run)、以…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...