机器学习模型——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_score

iris = 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 plt

plt.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_iris

iris = load_iris()

X = iris.data

sse = []
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.data

from 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.data

from 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.data

from 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.data

from 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.data

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=1,min_samples=10)
dbscan.fit(X)

print(dbscan.labels_)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过电机转速计算主轴旋转单圈所需时间(CODESYS ST代码)

1、伺服丝杠系统常用算法功能块 伺服丝杠系统常用算法功能块-CSDN博客文章浏览阅读353次。这篇博客主要介绍伺服、丝杠系统常用的运算功能块,其它相关运算可以查看下面文章链接:信捷PLC脉冲频率、位移、转速相关计算(C语言编程应用)_RXXW_Dor的博客-CSDN博客。https://rxxw-…

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…

系统思考—领导者

“组织是船&#xff0c;领导者是什么角色&#xff1f;” 对于这个看似简单的问题&#xff0c;很多人可能会直观地想到船长或舵手。但学习型组织的倡导者彼得圣吉给出了另一种视角&#xff1a;如果组织是一艘船&#xff0c;那么领导者首先应该是这艘船的设计师。 在我近期与各个…

Linux:进程等待究竟是什么?如何解决子进程僵尸所带来的内存泄漏问题?

Linux&#xff1a;进程等待究竟是什么&#xff1f;如何解决子进程僵尸所带来的内存泄漏问题&#xff1f; 一、进程等待的概念二、进程等待存在的意义三、如何进行进程等待3.1 wait()是实现进程等待1、wait()原型2. 验证wait()能回收僵尸子进程的空间 3.2 waitpid()实现进程等待…

电子积木方案开发商

东莞市酷得智能科技有限公司电子积木方案开发商 提供消费电子解决方案、提供IC技术支持&#xff0c;全国线上线下服务 积木小车底层驱动开发过程主要涉及到以下几个方面&#xff1a; 首先&#xff0c;需要对小车底盘结构、硬件、模块等有深入的了解。底盘承载着机器人定位、导…

Kubernetes(k8s):Pod 的 Node Selector详解

Kubernetes&#xff08;k8s&#xff09;&#xff1a;Pod 的 Node Selector详解 1、什么是Node Selector&#xff1f;2、Node Selector的工作原理3、Node Selector的用法1、例如&#xff1a;给node01 、node02 分别打上标签2、使用标签调度Pod3、删除节点的标签 &#x1f496;Th…

java面试题(Redis)

事情干的差不多了&#xff0c;开刷面试题和算法&#xff0c;争取在短时间内快速成长&#xff0c;理解java面试的常见题型 一、redis使用场景&#xff1a; 缓存&#xff1a;穿透、击穿、雪崩 双写一致、持久化 数据过期、淘汰策略 分布式锁&#xff1a;setnx、redisson 计数…

武汉星起航推出亚马逊一站式孵化平台,助力合作伙伴快速成长

武汉星起航电子商务有限公司&#xff0c;自2020年正式成立以来&#xff0c;凭借其专业的运营团队和丰富的行业经验&#xff0c;在跨境电商领域取得了显著的成绩。为了进一步满足市场需求&#xff0c;武汉星起航决定推出亚马逊一站式孵化平台&#xff0c;旨在为合作伙伴提供更全…

网盘分享链接

点击打开下面这条链接&#xff0c;保存文件 https://pan.xunlei.com/s/VNuDMRtfBQvmfqqwjsBAIg2pA1?pwdhqd3 网盘里文件太多&#xff0c;找不到&#xff0c;怎么办&#xff1f; 进入我的B站主页【I泠霖I的个人空间-哔哩哔哩】 https://b23.tv/VYxaiJb&#xff0c;点击右上角的…

PC发送指令给单片机控制LED(与上一篇文章相反)

此时要重新配置寄存器 &#xff0c;实现电脑往单片机传输数据 1、配置SCON寄存器的REN 即 REN 1 2、有TI&#xff08;发送中断&#xff09;就有RI&#xff08;接收中断&#xff09; 3、优化 发现发送 o 时&#xff0c;D5亮灯会有延迟 下面就是做到真正的无延迟的全双工通信 …

JVM基础

初识JAM JVM就是JAVA虚拟机&#xff0c;本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行JAVA字节码文件. 下面是java代码执行过程 JVM的功能 1.解释和运行 对字节码文件中的指令实时的解释成机器码 2.内存管理 自动为对象&#xff0c;方法等分配内存自动的垃圾回…

27.WEB渗透测试-数据传输与加解密(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;26.WEB渗透测试-BurpSuite&#xff08;五&#xff09; BP抓包网站网址&#xff1a;http:…

IIC协议——OLED(128*64)外设

IIC协议&#xff08;Inter-Integrated Circuit Protocol&#xff09;&#xff0c;也被称为I2C&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;是一种串行通信协议&#xff0c;通常用于连接集成电路&#xff08;IC&#xff09;和外部设备&#xff0c;例如传感器、…

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择&#xff0c;因为它简单、成本效益高&#xff0c;并且易于维护。静态网站由不含服务器端脚本的文件组成&#xff0c;如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤&#xff1a; 如果大家没有AWS免费账号&#x…

STM32CubeIDE基础学习-舵机控制实验

STM32CubeIDE基础学习-舵机控制实验 文章目录 STM32CubeIDE基础学习-舵机控制实验前言第1章 硬件介绍第2章 工程配置2.1 基础工程配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 前言 SG90、MG996舵机在机器人领域用得非常多&#xff0c;因为舵机有内置控制电…

【Java网络编程】OSI七层网络模型与TCP/IP协议簇

1.1、OSI七层网络模型 OSI七层网络模型中&#xff0c;每层的功能如下&#xff1a; 应用层&#xff1a;人与计算机网络交互的窗口。表示层&#xff1a;负责数据格式的封装&#xff0c;如加密、压缩、编解码等。会话层&#xff1a;建立、终止、管理不同端间的会话连接。传输层&a…

[技术闲聊]我对电路设计的理解(九)-如何与Layout工程师交互

一、“”电路设计“的理解 原理图设计完成&#xff0c;设计规则检测、netlist都通过后&#xff0c;就可以把原理图发送给Layout&#xff0c;是不是此刻意味着硬件工程师功成身退了呢&#xff1f; 远远没有&#xff0c;还有多件事情等待着&#xff0c;文章题目我对电路设计的理解…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中&#xff0c;child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块&#xff0c;Node.js可以执行系统命令、运行其他脚本或应用程序&#xff0c;实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

搭建电商独立站|适合做独立站的国家有哪些?该怎么布局?

在传统外贸和跨境电商行业&#xff0c;独立站是一种更专业并且获益空间相对会更高的方法&#xff0c;独立站可以让卖家拥有更多的自由控制权&#xff0c;卖家能更精准的定位用户人群&#xff0c;也可以自行流量推广&#xff0c;独立站不会被永远封店铺、不会对卖家进行罚款等等…

HTML - 你如何使H5页面禁止手动缩放

难度级别:初级及以上 提问概率:40% 我们知道,这道题其实是在考察meta标签的viewport属性,正常情况下设置viewport的代码为 <head><meta name="viewport" content="width=device-width,initial-scale=1.0" …