机器学习模型——K—Means算法

目录

无监督学习概念:

有监督学习与无监督学习:

无监督学习 - 聚类分析 :

聚类算法应用场景:

常用聚类算法介绍:

对不同的聚类算法应用选择原则:

基于原型聚类:

K-Means聚类算法概念及步骤:

 K-Means聚类 - K如何确定:

K-Means聚类的优缺点:

 K-Means的改进算法 

代码实现K值的选择:

枚举法:

 手肘法:

基于层次聚类:

概念:

自上向下(计算量非常大):

BIRCH算法:

代码实现:

自底向上(计算量非常大,不经常用):

Hierarchical Clustering算法原理:

Hierarchical Clustering算法优缺点:

基于密度聚类:

DBSCAN算法的基本概念:

DBSCAN算法将数据点分为三类:     

DBSCAN聚类算法优缺点:

代码实现:


无监督学习概念:

无监督学习:是指在未加标签的数据中,根据数据之间本身的属性特征和关联性对数据进行区分,相似相近或关联性强的数据放在一起,而不相似不相近、关联性不强的数据不放在一起。

无监督学习的本质是:利用无标签的数据学习数据的分布或数据与数据之间的关系。

无监督学习最常应用的场景是部分降维算法、聚类算法和关联算法。

有监督学习与无监督学习:

有监督学习中,如分类问题,要求事先必须明确知道各个类别的信息,其建立的前提是所有待分类项都有一个类别与之对应。但实际上分类问题可能获取到的数据记录对应的类别信息无法明确,尤其是处理海量数据时,如果通过预处理对数据进行打标,以满足分类算法的要求,代价非常大。

有监督学习中最常见的是分类问题,而无监督学习中最常见的是聚类问题,聚类问题不依赖预定义的类和类标号的训练实例。关注事物本身的特征分析。

   *比如电商对用户信息和购买行为数据进行聚类分析,目的是找到大量级的且有一定相似度的客   户     群,就可以针对该用户群共有的行为特征投放广告和其他营销活动。

无监督学习 - 聚类分析 :

聚类分析是分析研究对象(样品或变量)如何按照多个方面的特征进行综合分类的一种多元统计方法,它是根据物以类聚的思想将相似的样品(或变量)归为一类。

把对象分为不同的类别,类别是依据数据的特征确定的。

把相似的东西放在一起,类别内部的差异尽可能小, 类别之间的差异尽可能的大。

作用:

作为单独过程,用于对数据进行打标,即数据画像。

作为分类等其他学习任务的前驱过程,如聚类算法可以作为一些监督算法的前驱过程。

聚类算法应用场景:

离群点检测

离群点检测是数据挖掘中重要应用,任务就是发现与大部分观察对象显著不同的对象,大部分的数据挖掘方法会将这种差异信息视作噪声进行预处理,但是另外的一些应用中,离群点本身携带有重要的异常信息,是需要被关注和研究的。

离群点检测已经被广泛应用到电信、信用卡诈骗检测,贷款审批,电子商务,网络入侵和天气预报等领域,甚至可以利用离群点检测分析运动员的统计数据,以发现异常运动员。

用户画像构建方面:

根据客户数据,将相似性较高的客户聚为一类,打标签,进行客户类别细分。

业务推荐和精准营销方面:

通过构建用户画像进行业务推荐和精准营销。

常用聚类算法介绍:

基于原型聚类(partitioning methods)

 K-Means算法,K-Mediods 算法

基于层次聚类(hierarchical methods)、

Hierarchical Clustering算法、BIRCH算法

基于密度聚类(density-based methods)  

DBSCAN算法

对不同的聚类算法应用选择原则:

是否适用于大数据量,算法的效率是否满足大数据量高复杂性的要求。

是否能应付不同的数据类型,能否处理符号属性。

是否能发现不同类型的聚类。

是否能应付脏数据或异常数据。

是否对数据的输入顺序不敏感。

基于原型聚类:

K-Means聚类算法概念及步骤:

K-Means算法是一种常用的聚类分析方法,目的是将数据集划分为预定数量的簇,并确保簇内的数据点尽可能相似

以下是K-Means算法的核心概念和步骤:

  1. 预处理数据:包括标准化和异常点过滤等步骤,以便于处理。
  2. 确定K值:即需要形成的簇的数量,这通常根据实际需求预先给定(超参数)。
  3. 选取初始中心点:随机选择K个数据点作为初始簇中心(中心点的选取会直接影响到算法开始时的簇分配,并可能影响收敛速度和最终收敛的质量。)。
  4. 分配数据点:按照最小距离原则,将每个数据点分配到最近的簇中心所在的簇里。
  5. 更新簇中心:根据分配的结果,重新计算每个簇的中心点。
  6. 迭代优化:重复分配数据点和更新簇中心这两个步骤,直到簇中心不再发生变化或达到最大迭代次数。

 K-Means聚类 - K如何确定:

K-Means算法首先选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数。这样做的前提是已经知道数据集中包含多少个簇,但很多情况下,我们并不知道数据的分布情况。如何有效地确定K值,提供以下几种方法:

  1. 从实际问题出发,人工指定比较合理的K值,通过多次随机初始化聚类中心选取比较满意的结果。
  2. 均方根:假设我们有m个样本,该方法认为K=√m/2
  3. 枚举法:                                                                                                                                 用不同的K值进行聚类 分别计算类内距离均值和类间距离均值之比,选择最小的那个K值       对不同K值都产生2次聚类,选择两次聚类结果最相似的K值
  4. 手肘法(Elbow)、层次聚类法等

K-Means聚类的优缺点:

优点:

  1. 原理简单:K-Means算法的原理和实现都相对简单,易于理解和应用。
  2. 效率高:K-Means算法的计算复杂度接近线性,这意味着它可以高效地处理大型数据集。
  3. 收敛速度快:在迭代过程中,K-Means算法通常能够快速收敛到一个稳定的解。

缺点:

  1. 需要预先指定K值:在实际应用中,选择合适的K值可能需要尝试多种方法,这是一个挑战。
  2. 对初始质心敏感:算法的结果可能受到初始质心选择的影响,有时可能导致局部最优解而非全局最优解。
  3. 对噪声和离群点敏感:K-Means算法容易受到噪声和离群点的影响,这可能导致簇划分不准确。
  4. 对簇形状和大小敏感:K-Means算法假设簇是凸形的和各向同性的,这在实际中并不总是成立,因此可能不适用于形状复杂或大小差异较大的簇。
  5. 只能处理凸数据集:K-Means算法一般只用于凸数据集,对于非凸数据集,K-Means算法的处理效果很差

 K-Means的改进算法 

K-Means与K-Means++:

不同于K-Means算法第一次是随机选择K个聚类中心,K-Means++是假设已经选取了p个初始聚类中心(0<p<K),则在选取第p+1个聚类中心时:距离当前p个聚类中心越远的点会有更高的概率被选为第p+1个聚类中心。只有在选取第一个聚类中心(p=1)时是通过随机的方法。该改进方法符合一般的直觉:聚类中心互相之间距离得越远越好。这个改进直观简单,也非常有效。

其他改进算法还有:

 ISODATA:对于高纬度的数据样本,针对K值事先不一定能准确指定的情况,当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。

 https://www.cnblogs.com/yixuan-xu/p/6272208.html   K-Means++

KMeans++也是解决解决KMeans的初值敏感的问题,它与二分K-Means不同的是:在选择两个聚类点的时候不是随机选择,而是先随机选择一个点,第二个选择距离该点最远的点,再进行划分。当然,为了避免异常点的存在,第二个点的选择会选择距离较远的几个点并进行加权选择最终的第二个点。

K-Means:随机的选取初始质心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。

KMeans++:随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法可以用于抽样和筛出离群点后的样本数据上。

代码实现K值的选择:

枚举法:

首先我们用枚举法,来选择K值,枚举法K值的选择是观察其轮毂系数(silhouette_score),随着K值增加,轮廓系数的提升幅度开始减小,这通常也意味着达到了较好的聚类效果

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.metrics import silhouette_scoreiris = load_iris()X = iris.data# 枚举法
sil = []
for k in range(2,20):kmeans = KMeans(n_clusters=k)kmeans.fit(X)sil.append(silhouette_score(X,kmeans.labels_))import matplotlib.pyplot as pltplt.plot(range(2,20),sil)
plt.scatter(range(2,20),sil,c='Red')
plt.show()

由此看出K值在2的时候最好,因此我们选择2来作为K值

 手肘法:

K值的选择主要是看拐点。

from sklearn.cluster import KMeans
from sklearn.datasets import load_irisiris = load_iris()X = iris.datasse = []
for k in range(2,20):kmeans = KMeans(n_clusters=k)kmeans.fit(X)sse.append(kmeans.inertia_)import matplotlib.pyplot as plt
plt.plot(range(2,20),sse)
plt.scatter(range(2,20),sse,c='Red')
plt.show()

手肘法对于K值的选择应该是3或者是4,5 

基于层次聚类:

概念:

层次聚类法试图在不同层次对数据集进行划分,从而形成树形的聚类结构,数据集的划分可采用“自下向上”的聚合策略,也可以采用“自顶向下”的分拆策略。聚类的层次被表示成树形图。树根拥有所有样本的唯一聚类,叶子是仅有一个样本的聚类。

自上向下(计算量非常大):

BIRCH算法:

BIRCH算法即平衡迭代削减聚类法,其核心是用一个聚类特征3元组表示一个簇的有关信息,从而使一簇点的表示可用对应的聚类特征,而不必用具体的一组点来表示。它通过构造满足分支因子和簇直径限制的聚类特征树来求聚类。

BIRCH算法通过构建CF树来实现数据的压缩和聚类,这个过程可以看作是一种“自下而上”的聚合策略。具体来说,算法首先扫描数据库,建立一棵存放于内存的CF树,这个树结构可以被看作数据的多层压缩,试图保留数据的内在聚类结构。然后,算法采用某个选定的聚类算法,如K-means或者凝聚算法,对CF树的叶节点进行聚类,把稀疏的簇当作离群点删除,而把更稠密的簇合并为更大的簇。

3元组包含:数据点个数,数据点特征之和,数据点特征的平方和。

分支因子:规定了树的每个节点的样本个数

簇直径:体现一类点的距离范围

BIRCH算法通过聚类特征可以方便地进行中心、半径、直径及类内、类间距离的运算。

BIRCH算法中聚类特征树的构建过程是动态的,可以随时根据新的数据点对树进行重构,适合大规模数据集。

总结来说,BIRCH算法通过构建CF树并在此基础上进行聚类,实现了一种“自下而上”的聚合策略,这种方法在处理大规模数据集时非常有效,能够在不牺牲聚类质量的前提下,减少计算复杂性。

https://www.cnblogs.com/pinard/p/6179132.html 算法原理

代码实现:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.datafrom sklearn.cluster import Birch
bir = Birch(n_clusters=3,threshold=1000,branching_factor=5)
bir.fit(X)print(bir.labels_)

半径的选取如果太大,就会全部预测为一种类型。因此合理的半径是成功的标配。

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.datafrom sklearn.cluster import Birch
bir = Birch(n_clusters=3,threshold=1,branching_factor=5)
bir.fit(X)print(bir.labels_)

自底向上(计算量非常大,不经常用):

Hierarchical Clustering算法原理:

主要思路:确保距离近的点落在同一个簇(cluster)之中,

流程如下:

将每个对象作为一个簇c_i={x_i},形成簇的集合 C={c_i};

迭代以下步骤直至所有对象都在一个族中; 找到一对距离最近的簇:min D(c_i,c_j);

将这对簇合并为一个新的簇;

从原集合C中移除这对簇;

最终产生层次树形的聚类结构: 树形图。

https://blog.csdn.net/zhangyonggang886/article/details/53510767 原理

Hierarchical Clustering算法优缺点:

优点:

可排除噪声点的干扰,但有可能噪声点分为一簇。

适合形状不规则,不要求聚类完全的情况。

不必确定K值,可根据聚类程度不同有不同的结果。

原理简单,易于理解。

缺点:

计算量很大,耗费的存储空间相对于其他几种方法要高。

合并操作不能撤销。、

合并操作必须有一个合并限制比例,否则可能发生过度合并导致所有分类中心聚集,造成聚类失败。

基于密度聚类:

密度聚类的思想不同于K-Means,它是通过聚类的簇是否紧密相连来判断样本点是否属于一个簇,代表性的算法就是DBSCAN,它基于一组邻域参数来判断某处样本是否是紧密。

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法,可以不设置K值)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN还适用于非凸样本集

https://blog.csdn.net/dsdaasaaa/article/details/94590159 算法原理

DBSCAN算法的基本概念:

存在数据集D={x_1,x_2,…,x_m},DBSCAN的相关密度概念描述如下:

ε−邻域:对于x_j∈D,其ε−邻域包含样本集D中与x_j的距离不大于ε的点构成一个子样本集,即N_ε(x_j)={x_j∈D|distance(x_i,x_j)≤ε},该子样本集的样本个数记为|N_ε(x_j)|。

核心对象:对于任一样本x_j∈D,如果其ε−邻域对应的N_ε(x_j)至少包含min⁡_samples个样本,即如果|N_ε(x_j)|≥min⁡_samples,则x_j是核心对象。

密度直达:如果x_i位于x_j的ε−邻域中,且x_j是核心对象,则称x_i由x_j密度直达。注意反之不一定成立,即不能说x_j由x_i密度直达,除非且x_i也是核心对象。

  1. 密度可达:对x_i和x_j,如果存在样本序列p_1, p_2,..., p_T,满足p_1=x_i,p_T=x_j,且p_t+1由p_t密度直达,则称x_j由x_i密度可达,密度可达满足传递性。此时p_1, p_2,..., p_T−1均为核心对象,因为只有核心对象才能使其他样本密度直达。另外,密度可达不满足对称性,由密度直达的不对称得出。
  2. 密度相连:对于x_i和x_j,如果存在核心对象样本x_k,使x_i和x_j均由x_k密度可达,则称x_i和x_j密度相连。注意密度相连关系是满足对称性的。

DBSCAN算法将数据点分为三类:     

核心点:在半径ε内含有超过min⁡_samples数目的点。

边界点:在半径ε内点的数量小于min⁡_samples,但是落在核心点的邻域内的点。

噪音点:既不是核心点也不是边界点的点。

DBSCAN聚类算法优缺点:

DBSCAN的优点:

可以解决数据分布特殊(非凸, 互相包络,长条形等)的情况。

对于噪声不敏感 ,速度较快,不需要指定簇的个数;可适用于较大的数据集。

在邻域参数给定的情况下结果是确定的,只要数据进入算法的顺序不变,与初始值无关。

缺点:

因为对整个数据集我们使用的是一组邻域参数 ,簇之间密度差距过大时效果不好。

数据集较大的时候很消耗内存。

对于高维数据距离的计算会比较麻烦,造成维数灾难。

代码实现:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.datafrom sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.1,min_samples=100)
dbscan.fit(X)print(dbscan.labels_)

这种属于半径太小,最小样本点太大,导致所有数据均被预测为噪声点。

 

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.datafrom sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=100,min_samples=5)
dbscan.fit(X)print(dbscan.labels_)

这种属于半径太大,样本点太少导致的,所有数据均被预测为边界点

 

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.datafrom sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=1,min_samples=10)
dbscan.fit(X)print(dbscan.labels_)

在实际应用中,DBSCAN算法对半径和最小样本点的选取有着严格要求,合理的选取是必须的 

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

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

相关文章

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址&#xff0c;若有就直接返回。若无&#xff0c;则本地DNS服务器当DNS的客户&#xff0c;向其它根域服务器发送报文查询IP地址&#xff0c;简单来说就是帮助主机查找IP&#xff0c;所以递归查询就在客户端…

秋招复习笔记——八股文部分:操作系统

笔试得刷算法题&#xff0c;那面试就离不开八股文&#xff0c;所以特地对着小林coding的图解八股文系列记一下笔记。 这一篇笔记是图解系统的内容。 硬件结构 CPU执行程序 计算机基本结构为 5 个部分&#xff0c;分别是运算器、控制器、存储器、输入设备、输出设备&#xf…

Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo

概述 本文探讨 Wails 框架的使用&#xff0c;从搭建环境到开发&#xff0c;再到最终的构建打包&#xff0c;本项目源码 GitHub 地址&#xff1a;https://github.com/mazeyqian/go-run-wechat-demo 前言 Wails 是一个跨平台桌面应用开发框架&#xff0c;他允许开发者利用 Go …

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …

抖音变现项目有哪些?来这几个资源网站看看吧

做短视频就像是在做一道菜&#xff0c;你得有那么几个秘密武器&#xff0c;才能让你的作品从众多视频中脱颖而出。我这个视频剪辑界的“烹饪大师”&#xff0c;今天就来给大家分享一下我的厨房秘籍——那些让我视频大放异彩的素材网站。九才素材网&#xff1a; 说起九才素材网…

javaScript中原型链

一、原型链 js 的对象分为普通对象和函数对象。每个对象都有__proto__ 但是只有函数对象 (非箭头函数) 才有 prototype 属性。 new的过程&#xff1a; 1、创建一个空的简单 javaScript对象 2、将空对象的 __proto__连接到该函数的 prototype 3、将函数的this指向新创建的对象…

物联网网关

TopLink 是图扑物联专为针对工业物联网边缘侧应用场景打造的一款部署在本地近场环境、以高性能计算机为载体、与云端协同的一体化计算服务产品。具备工业协议解析、数据采集和转发、本地监控、本地场景联动等核心功能&#xff0c;具有跨平台、易使用等特点。 TopLink还默认适配…

小白水平理解面试经典题目1431. Kids With the Greatest Number of Candies【Array类】

个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 1431. 拥有最多糖果的孩子 小白渣翻译 一…

qt样式表及qss文件的使用

三种设置样式表的方法&#xff1a; 1.使用ui文件&#xff0c;选中具体右键样式表输入即可 2.使用纯代码 mywidget::mywidget(QWidget *parent) : QWidget(parent) {this->setGeometry(100,100,500,500);this->setObjectName("mywidget");this->setStyleSh…

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…

Python爬虫之分布式爬虫

分布式爬虫 1.详情介绍 分布式爬虫是指将一个爬虫任务分解成多个子任务&#xff0c;在多个机器上同时执行&#xff0c;从而加快数据的抓取速度和提高系统的可靠性和容错性的技术。 传统的爬虫是在单台机器上运行&#xff0c;一次只能处理一个URL&#xff0c;而分布式爬虫通过将…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

运行游戏找不到steam_api64.dll怎么办?steam_api64.dll丢失解决方法

steam_api64.dll是64位Windows操作系统上的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;其大小通常在1.5-3.5 MB之间。这个文件对于Steam平台至关重要&#xff0c;因为它实现了游戏验证、更新等功能&#xff0c;并确保了用户拥有游戏的合法使用权。它通过提供一…

tensorflow.js 使用 opencv.js 将人脸特征点网格绘制与姿态估计线绘制结合起来,以获得更高的帧数

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图 文章目录 系列文章目录前言一、实现步…

【Liunx】什么是make和makefile?

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

蓝桥杯-油漆面积

代码及其解析:(AC80%&#xff09; 思路:是把平面划成单位边长为1&#xff08;面积也是1&#xff09;的方格。每读入一个矩形&#xff0c;就把它覆盖的方格标注为已覆盖&#xff1b;对所有矩形都这样处理&#xff0c;最后统计被覆盖的方格数量即可。编码极其简单&#xff0c;但…

让无刷电机转起来——换相(BLDC)

目录 1. 引言 2. 无刷电机换相原理 2.1 通电原理&#xff08;一相&#xff09; 2.2 换相原理&#xff08;三相&#xff09; 2.3 驱动电路 2.3.1 上下桥臂 2.3.2 六步换相 3. 结束语 1. 引言 前面博客&#xff0c;博主对于无刷电机的驱动方式与电路作了简要的介绍&#…

一键开启Scrum回顾会议的精彩时刻

其实回顾会议作为一个检视、反馈、改进环节&#xff0c;不仅在传统的瀑布管理模式中&#xff0c;还是在Scrum一类的敏捷管理流程中&#xff0c;都是非常重要的活动。一些团队认为它无法产生直接的价值&#xff0c;所以有意忽略了这个会议&#xff1b;一些团队在越来越多的回顾中…

DNS 各记录类型说明及规则

各记录类型使用目的 记录类型使用目的A 记录将域名指向一个 IP 地址。CNAME 记录将域名指向另一个域名&#xff0c;再由另一个域名提供 IP 地址。MX 记录设置邮箱&#xff0c;让邮箱能收到邮件。NS 记录将子域名交给其他 DNS 服务商解析。AAAA 记录将域名指向一个 IPv6 地址。…

Vite 项目中环境变量的配置和使用

Vite 项目中环境变量的声明 我们要在 Vite 项目中进行环境变量的声明&#xff0c;那么需要在项目的根目录下&#xff0c;新建 .env.[mode] 文件用于声明环境变量&#xff0c;如&#xff1a; .env.test 文件用于测试环境下项目全局变量的声明.env.dev 文件用于开发环境下项目全…