k-均值聚类

K均值聚类(K-means clustering)是一种常用的无监督学习方法,用于将一组数据点划分为K个簇(cluster)。

它的目标是将相似的数据点归到同一个簇中,同时使得不同簇之间的数据点尽可能不相似。K均值聚类算法的基本步骤如下:

  • 随机选择K个数据点作为初始簇中心。
  • 对于每个数据点,计算其与各个簇中心的距离,并将其归到距离最近的簇。
  • 根据步骤2的结果,更新每个簇的中心,新的簇中心是簇内所有数据点的均值。
  • 重复步骤2和3,直到簇中心的变化小于某个阈值或达到最大迭代次数。
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
import math
X,y=make_blobs(n_samples=1000,n_features=2,centers=4,random_state=0)
plt.scatter(X[:,0],X[:,1],s=50,c=y)
plt.show()

请添加图片描述

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4,n_init=20)
kmeans.fit(X)
centroids = kmeans.cluster_centers_
labels = kmeans.labels_
# 获取聚类中心
centroids
array([[ 1.99871335,  0.79038817],
       [ 0.97790397,  4.28661633],
       [-1.31360134,  7.86561393],
       [-1.51473374,  2.8755229 ]])
#  获取每个数据点的标签
labels[:2]
array([2, 1], dtype=int32)
plt.scatter(X[:,0], X[:,1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='X')
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

请添加图片描述

衡量K均值聚类效果的一种常见方法是计算轮廓系数(Silhouette Coefficient)。

轮廓系数是一个介于-1到1之间的值,用于评估聚类的紧密程度和分离程度。

轮廓系数越接近1,表示聚类效果越好;轮廓系数越接近-1,表示聚类效果越差;轮廓系数接近0,则表示聚类重叠。

轮廓系数的计算方式如下:

  • 对于每个样本,计算它与同簇其他样本的平均距离(称为a值)。
  • 对于每个样本,找到与其最近的另一个簇,计算该样本与该簇内所有样本的平均距离(称为b值)。
  • 对于每个样本,计算轮廓系数:(b - a) / max(a, b)。
# 在sklearn中,可以使用silhouette_score函数来计算轮廓系数
from sklearn.metrics import silhouette_score
# 计算轮廓系数
silhouette_avg = silhouette_score(X, labels)
silhouette_avg
0.4962703221079925

除了轮廓系数,还有一些其他指标可以用来评估聚类的效果,例如:

  • 内部凝聚度(Within-Cluster Sum of Squares, WCSS):衡量簇内样本的紧密程度,WCSS越小,簇内样本越紧密。
  • 戴维森堡丁指数(Davies-Bouldin Index):衡量簇之间的分离程度,值越小,簇之间分离得越好。
  • 调整兰德指数(Adjusted Rand Index, ARI):如果已知真实标签,可以使用ARI来评估聚类结果与真实标签的相似度。

选择哪种评估指标取决于你的具体应用场景和需求。

如果是对聚类效果的初步评估,轮廓系数通常是一个不错的选择。

如果你有真实的标签数据,可以使用ARI来评估聚类的准确性。

from sklearn.metrics import adjusted_rand_score
ari = adjusted_rand_score(y, labels)
ari
0.8304756406041541

确定聚类点的个数(即确定最佳的聚类数K)是一个关键问题,也是聚类分析中的一个挑战。以下是一些常用的方法来确定最佳的聚类数:

  1. 肘部法则(Elbow Method):
    • 计算不同K值下的内部凝聚度(WCSS)。
    • 绘制WCSS随着K值增加的变化曲线。
    • 曲线的“肘部”通常被认为是最佳的K值,因为在这一点之后,增加聚类数带来的改善变得不那么显著。
  2. 轮廓系数(Silhouette Coefficient):
    • 对于不同的K值,计算所有样本的轮廓系数。
    • 选择使平均轮廓系数最大的K值作为最佳的聚类数。
  3. 间隙统计(Gap Statistic):
    • 计算不同K值下的聚类效果与参考分布(通常是随机数据)之间的间隙。
    • 选择使间隙最大的K值作为最佳的聚类数。
  4. 信息准则(Information Criterion):
    • 使用类似于决策树的方法,如赤池信息准则(AIC)或贝叶斯信息准则(BIC)。
    • 选择使信息准则最小的K值作为最佳的聚类数。
  5. 基于密度的方法:
    • 使用DBSCAN(Density-Based Spatial Clustering of Applications with Noise)等基于密度的聚类算法,它们不需要预先指定聚类数。
  6. 层次聚类(Hierarchical Clustering):
    • 使用层次聚类方法构建聚类树。
    • 根据树状图或距离阈值来确定最佳的聚类数。
      在实际应用中,可能需要结合多种方法来确定最佳的聚类数,因为每种方法都有其优势和局限性。以下是一个使用肘部法则和轮廓系数来确定最佳聚类数的示例:
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# 使用肘部法则
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

请添加图片描述

# 使用轮廓系数
silhouette_scores = []
for i in range(2, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    cluster_labels = kmeans.predict(X)
    silhouette_scores.append(silhouette_score(X, cluster_labels))
plt.plot(range(2, 11), silhouette_scores)
plt.title('Silhouette Score')
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Score')
plt.show()

请添加图片描述

在这个示例中,我们首先使用肘部法则绘制了WCSS随着聚类数增加的变化曲线,然后使用轮廓系数绘制了不同聚类数下的平均轮廓系数。根据这两个图表,我们可以观察到最佳的聚类数。通常,我们会寻找WCSS曲线的“肘部”和轮廓系数的最高点,这些点通常指示最佳的聚类数。

关于K-均值聚类算法:

  1. 无监督学习:K-均值是一种无监督机器学习算法,用于将未标记的数据集分为若干个簇。
  2. 简单易实现:算法原理简单,实现起来较为容易,适合处理大规模数据集。
  3. 迭代优化:通过迭代过程不断更新簇中心,直到满足停止条件(如达到最大迭代次数或簇中心变化小于阈值)。
  4. 簇数量预定义:需要预先指定簇的数量K,这对于算法的结果有重要影响。
  5. 基于距离:算法基于数据点之间的距离来进行聚类,通常使用欧氏距离。
  6. 可能陷入局部最优:K-均值算法可能陷入局部最优解,初始中心的选择对结果有很大影响。

在应用中需要注意的一些问题:

  1. 选择合适的K值:确定最佳的簇数量K是K-均值聚类中的一个关键问题,可以使用肘部法则、轮廓系数等方法来估计。
  2. 初始化中心:初始中心的选择可能会影响最终聚类结果,可以使用多次随机初始化或K-means++等方法来改善。
  3. 噪声和离群点:K-均值对噪声和离群点敏感,可能会对聚类结果产生负面影响,需要对数据进行预处理。
  4. 变量尺度:不同特征的尺度可能会对聚类结果产生影响,需要进行标准化或归一化处理。
  5. 非凸聚类:K-均值适用于凸数据集,对于非凸聚类或具有复杂形状的簇,K-均值可能不是最佳选择。
  6. 解释性:K-均值聚类的结果可能不具有很好的解释性,特别是在高维数据中。
  7. 计算复杂度:随着数据量和簇数量的增加,计算复杂度会上升,可能需要考虑算法的效率。
  8. 适用性:K-均值聚类适用于数值型数据,对于非数值型数据,可能需要转换为数值型数据或使用其他聚类算法。
  9. 超参数调整:K-均值算法中的一些超参数(如最大迭代次数、距离度量等)可能需要根据具体问题进行调整。
  10. 评估聚类质量:使用适当的评估指标(如轮廓系数、WCSS等)来评估聚类结果的质量。

数据预处理

K-均值聚类算法对噪声和离群点的敏感性是因为它们对聚类中心的计算有显著影响。为了减少这种影响,可以在聚类之前对数据进行预处理。以下是一些处理噪声和离群点的方案:

  1. 离群点检测:
    • 使用箱线图(Box Plot)等方法检测离群点,并移除它们。
    • 使用DBSCAN等基于密度的聚类方法来识别噪声点。
  2. 数据标准化:
    • 对数据进行标准化或归一化,使得每个特征对聚类中心的贡献相同。
    • 例如,使用最小-最大标准化或Z-score标准化。
  3. 特征选择:
    • 移除与聚类无关的特征,特别是那些可能引入噪声的特征。
    • 使用主成分分析(PCA)等降维技术来减少特征数量。
  4. 数据清洗:
    • 手动检查数据,移除明显错误的或异常的数据点。
    • 使用数据清洗工具或库(如OpenRefine)来自动化清洗过程。
  5. 使用鲁棒性更强的距离度量:
    • 使用马氏距离(Mahalanobis Distance)等鲁棒性更强的距离度量,减少离群点的影响。
  6. 软聚类方法:
    • 使用模糊C-均值(FCM)或基于密度的聚类方法,这些方法允许样本属于多个簇,从而减少离群点的影响。
  7. 预处理步骤:
    • 在聚类之前,使用平滑技术或滤波器(如中值滤波)来减少噪声。
  8. 异常值处理:
    • 使用异常值检测算法(如LOF、IF等)来识别和处理异常值。
  9. 聚类后处理:
    • 在聚类完成后,分析聚类结果,检查簇的大小和密度,手动或自动地调整聚类结果。
  10. 使用专业软件或库:
    • 使用专门设计用于处理噪声和离群点的软件或库,如Robust PCA。
      在实际应用中,可能需要结合多种方法来处理噪声和离群点,以获得最佳的聚类结果。此外,预处理步骤可能需要根据具体的数据集和聚类任务进行调整。

K-means++

K-means++是一种用于初始化K-均值聚类算法中簇中心的方法。在标准的K-均值算法中,初始簇中心是随机选择的,这可能导致算法收敛到局部最优解,尤其是当簇的形状和大小差异较大时。K-means++旨在通过一种更合理的方法来选择初始中心,从而提高算法的稳定性和聚类质量。
K-means++的初始化过程如下:

  1. 随机选择第一个中心:从数据集中随机选择一个样本作为第一个簇中心。
  2. 选择后续中心:对于剩下的每个中心,选择的原则是选择那些与已有中心距离最远的样本。具体来说,每个样本被选为下一个中心的概率与它到最近中心的距离的平方成正比。
  3. 重复选择:重复步骤2,直到选择了K个中心。
    K-means++的主要优点是它减少了初始中心选择对聚类结果的影响,特别是当数据集具有不同的簇大小和密度时。通过这种方法,K-means++通常能够找到更好的局部最优解,从而提高聚类的整体质量。
    在Python的sklearn库中,可以通过设置KMeans初始化参数init='k-means++'来使用K-means++初始化方法。例如:
from sklearn.cluster import KMeans
# 使用K-means++初始化
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, max_iter=300, random_state=42)
kmeans.fit(X)
# 获取聚类结果
labels = kmeans.labels_

# 在这个例子中,`init='k-means++'`指定了使用K-means++来初始化簇中心,`n_init=10`表示算法会使用K-means++初始化10次,并选择最好的聚类结果。

数据集的凸性

在聚类分析中,数据集的凸性是一个重要的概念,它关系到聚类算法的适用性和聚类结果的质量。

  1. 凸数据集
    • 如果数据集的每个点都位于某个凸多边形内部,那么这个数据集就是凸的。
    • 凸数据集意味着数据点之间的最小距离沿着连接这些点的线段上。
    • 在凸数据集中,K-均值算法能够较好地工作,因为它能够找到将数据点分为几个紧凑的簇的聚类中心。
  2. 非凸聚类
    • 非凸聚类指的是数据集的簇不是凸的,而是具有不规则的形状或重叠的边界。
    • 非凸聚类意味着数据点之间的最小距离不沿着连接这些点的线段上,而是沿着更复杂的路径。
    • 在非凸聚类中,K-均值算法可能无法找到理想的聚类中心,因为它倾向于将簇中心定位在簇的中心,而不是沿着边界。
  3. 具有复杂形状的簇
    • 具有复杂形状的簇是指簇的边界不是简单的直线或平面,而是具有多个拐点或弯曲的形状。
    • 这样的簇通常出现在高维空间中,其中数据点可以形成复杂的几何形状。
    • K-均值算法在处理这类簇时可能会遇到困难,因为它在寻找聚类中心时可能无法捕捉到簇的复杂形状。
      在实际应用中,数据集可能同时包含凸簇和非凸簇,或者数据点在某些维度上是凸的,而在其他维度上是非凸的。因此,选择合适的聚类算法时需要考虑数据集的特性,并且在可能的情况下,可以结合使用多种聚类算法来获得更好的聚类结果。对于非凸聚类或具有复杂形状的簇,可以考虑使用基于密度的聚类算法(如DBSCAN)、层次聚类、模糊C-均值(FCM)或其他能够处理非凸数据集的聚类算法。

自动选择最佳簇数量

有一些工具和方法可以帮助自动选择最佳簇数量,而不需要手动调整参数。以下是一些常用的自动选择最佳簇数量的方法:

  1. Elbow Method Visualization:
    • 手动绘制WCSS(Within-Cluster Sum of Squares)随K值变化的曲线。
    • 观察曲线在何时开始变平缓,这个点通常对应于最佳的K值。
  2. Silhouette Score:
    • 对于不同的K值,计算所有样本的轮廓系数。
    • 选择使平均轮廓系数最大的K值作为最佳簇数量。
  3. Gap Statistic:
    • 计算不同K值下的聚类效果与参考分布之间的间隙。
    • 选择使间隙最大的K值作为最佳簇数量。
  4. AutoKMeans:
    • 这是一个Python库,它提供了一种自动选择最佳簇数量的方法。
    • 使用网格搜索和交叉验证来找到最佳的K值。
  5. Hierarchical Clustering with Dendrograms:
    • 使用层次聚类构建聚类树。
    • 根据树状图或距离阈值来确定最佳簇数量。
  6. Mean-Shift and Gaussian Mixture Models:
    • 这些算法可以自动选择最佳簇数量。
    • 通过优化某种性能指标(如BIC或AIC)来确定K值。
  7. Auto-Ensemble:
    • 这是一个Python库,它提供了一种自动选择最佳簇数量的方法。
    • 它通过多种聚类算法和评估指标来找到最佳的K值。
  8. Agglomerative Clustering:
    • 使用层次聚类算法,根据树状图或距离阈值来确定最佳簇数量。
      在实际应用中,可能需要结合多种方法来确定最佳簇数量。此外,不同的应用场景可能需要不同的评估指标和策略。例如,在时间序列分析中,可能需要考虑时间序列的长度,而在图像处理中,可能需要考虑图像的分辨率。

业务应用

K-均值聚类算法广泛应用于实际业务中,尤其是在需要将大量数据划分为有意义类别的情况下。以下是一个结合业务的K-均值聚类算法应用示例:

业务场景: 电子商务平台商品分类

问题描述: 电子商务平台上有大量的商品,每种商品都有多个属性,如价格、品牌、尺寸、颜色等。为了更好地组织商品,并为用户提供更准确的搜索和推荐服务,需要对这些商品进行有效的分类。

解决方案: 使用K-均值聚类算法对商品进行分类。

步骤:

  1. 数据准备
    • 收集商品的多个属性数据,如价格、品牌、尺寸、颜色等。
    • 选择合适的特征集,例如,只使用价格和品牌作为聚类的特征。
  2. 选择初始簇数
    • 可以使用肘部法则、轮廓系数或自动选择最佳簇数量的方法来估计最佳的簇数K。
  3. 应用K-均值算法
    • 使用选择的K值,应用K-均值算法对商品进行聚类。
    • 初始化聚类中心,并迭代更新聚类中心和分配每个商品到最近的簇。
  4. 评估聚类质量
    • 使用轮廓系数、内部凝聚度等指标来评估聚类质量。
    • 检查每个簇的商品是否具有相似的特征,如价格范围、品牌等。
  5. 结果应用
    • 根据聚类结果,为每个簇创建一个商品类别。
    • 在网站的商品展示、搜索和推荐系统中使用这些类别。
    • 根据用户的历史行为和偏好,推荐相似的商品给用户。
  6. 迭代优化
    • 定期重新聚类商品,以反映市场变化和用户行为的变化。
    • 根据业务需求和用户反馈调整聚类参数和特征选择。

优点:

  • K-均值算法简单高效,能够快速处理大量数据。
  • 可以根据业务需求灵活选择聚类特征和评估指标。
  • 结果可以应用于多个业务场景,如商品分类、搜索优化和个性化推荐。

注意事项:

  • 需要对数据进行预处理,例如处理缺失值、标准化特征等。
  • 初始聚类中心的选择对结果有影响,可能需要多次尝试找到最佳初始中心。
  • 业务需求和数据特性可能会影响聚类结果,需要根据实际情况调整聚类参数和特征选择。

在商品推荐中应用聚类结果通常涉及以下步骤:

  1. 数据收集
    • 收集用户行为数据,如购买历史、浏览历史、搜索历史等。
    • 收集商品数据,包括商品特征、价格、库存、类别等。
  2. 用户聚类
    • 使用K-均值或其他聚类算法对用户进行聚类,基于用户的相似行为和偏好。
    • 每个簇代表一组具有相似偏好的用户。
  3. 商品聚类
    • 同样使用K-均值或其他聚类算法对商品进行聚类,基于商品的相似特征和属性。
    • 每个簇代表一组具有相似特征的商品。
  4. 推荐策略
    • 根据用户所在的聚类,推荐与之相似的商品聚类中的商品。
    • 例如,如果用户A属于用户聚类C1,那么推荐商品聚类C1中的商品给用户A。
  5. 个性化调整
    • 考虑用户的个性化偏好,例如用户A在聚类C1中,但更喜欢聚类C2中的商品,那么在推荐时可以考虑增加聚类C2中的商品比例。
  6. 反馈循环
    • 收集用户对推荐商品的反馈,如点击率、购买率等。
    • 基于反馈调整聚类结果和推荐策略,以提高推荐准确性。
  7. 性能评估
    • 定期评估推荐系统的性能,例如使用准确率、召回率、F1分数等指标。
    • 根据评估结果调整聚类参数和推荐策略。
  8. 实时更新
    • 随着用户行为和商品信息的变化,定期更新聚类结果和推荐列表。
      通过在商品推荐中应用聚类结果,可以更准确地识别用户的偏好,并提供更个性化的推荐。这种方法不仅提高了推荐的准确性,还能帮助用户发现更多符合他们兴趣的商品。

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

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

相关文章

学习笔记记录ensp中防火墙配置(trust,unstrus,dmz 资源下载可用)

实验目的,通过配置防火墙控制相互之间的访问,拓扑图如下 资源已上传,注意lsw1和ar2的路由表到各个网段的路由表配置,通过防火墙来控制各个区域能否访问成功。 防火墙通过cloud2链接,方便登录网页配置防火墙策略。防火…

分享基于鸿蒙OpenHarmony的Unity团结引擎应用开发赛

该赛题旨在鼓励更多开发者基于OpenHarmony4.x版本,使用团结引擎创造出精彩的游戏与应用。本次大赛分为“创新游戏”与“创新3D 化应用”两大赛道,每赛道又分“大众组”与“高校组”,让不同背景的开发者同台竞技。无论你是游戏开发者&#xff…

操作系统—系统调用(实验)

文章目录 系统调用1.实验目标2.实验过程记录(1).理解系统调用接口(2).阅读argraw、argint、argaddr和argstr(3).理解系统调用的解耦合实现方式(4).wait系统调用的非阻塞选项实现(5).yield系统调用的实现 3.存在的问题及解决方案实验小结 系统调用 1.实验目标 阅读并了解xv6内核…

基于Python+Selenium+Pytest的Dockerfile如何写

使用 Dockerfile 部署 Python 应用程序与 Selenium 测试 在本文中,我们将介绍如何使用 Dockerfile 部署一个 Python 应用程序,同时利用 Selenium 进行自动化测试。我们将使用官方的 Python 运行时作为父镜像,并在其中安装所需的依赖项和工具…

Error creating bean with name ‘ribbonLoadBalancingHttpClient‘~

场景 利用Ribbon来实现负载均衡 报错提示 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ribbonLoadBalancer defined in org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration: Unsatisfi…

Linux中的vi与vim:编辑器的王者之争与深度探索

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

opencv android 使用笔记

目录 获取app路径: 下载:OpenCV-android-sdk cmakelist配置: 头文件路径: 编译报错:clang: error: linker command failed with exit code 1 (use -v to see invocation) 读取图片例子 保存mp4 获取app路径&am…

UE4网络图片加载库(带内存缓存和磁盘缓存)

UE4网络图片加载库,带内存缓存和磁盘缓存,支持自定义缓存大小,支持蓝图和C++代码调用 1、调用示例 2、对外暴露函数 3、源代码-网络模块 KeImageNet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreM…

链表操作III

看这篇文章之前,可以先看看链表操作I和链表操作II。而这篇文章主要是想说明两道关于链表环的问题。 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…

【六十】【算法分析与设计】用一道题目解决dfs深度优先遍历,dfs中节点信息,dfs递归函数模板进入前维护出去前回溯,唯一解的剪枝飞升返回值true

路径之谜 题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着音走,也不能跳跃。每走到一个新方格,就要向正北 方和正西…

【Linux】解决ubuntu20.04版本插入无线网卡没有wifi显示【无线网卡Realtek 8811cu】

ubuntu为Realtek 8811cu安装驱动,解决wifi连接问题 1、确认无线网卡的型号-Realtek 8810cu2、下载并配置驱动 一句话总结:先确定网卡的型号,然后根据网卡的型号区寻找对应的驱动下载,下载完成之后在ubuntu系统中进行编译&#xff…

3D 文件格式的江湖纷争

自从上世纪 60 年代计算机辅助设计(Computer Aided Design, CAD)发明已来,3D 图形产业繁荣发展,逐步覆盖工业制造、影视游戏、VR/AR 、3D 打印等各个领域。如果说 3D 模型是构成 XR 应用场景的基础组件,那么 3D 文件格式就是构建 XR 世界沟通语言。而伴随各种 3D 建模软件…

C++链表操作入门

数据结构基础:链表操作入门 数据结构基础:链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础:链表操作入门 在计算机科学中,数据结构是组织和存储数据的方式&#x…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准,也被称作MPEG-4 AVC(Advanced Video Coding),是一种被广泛使用的数字视频压缩标准,由国际电信联盟(ITU-T)和国际标准化组织(ISO)共同开发。…

【蓝牙协议栈】【BLE】低功耗蓝牙工作流程(角色\广播\扫描\连接等专业名词介绍)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【精讲蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#x…

谷歌搜索seo排名怎么做上去?

谷歌算法纵使千变万化,用户体验(UX)也始终是核心,用户体验包含很多,但核心就是让访问你网站的人觉得你的网站看着顺眼,同时轻松找到他们需要的信息或服务,这意味着你的网站得易于导航&#xff0…

命名空间:namespace

对于无名命名空间 :但是不能再次定义相同名称的变量 在同一文件中

Stable Diffusion WebUI 使用 LoRA 调整风格——详细教程

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本教程旨在深入探讨 LoRA 模型的奥秘,涵盖其基本概念、独特作用以及实操指南。我们将从下载和使用LoRA的步…

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

微信小程序实时日志使用,setFilterMsg用法

实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题,我们推出了实时日志功能。开发者可通过提供的接口打印日志,日志汇聚并实时上报到小程序后台。开发者可从We分析“性能质量->实时日志->小程序日志”进入小程序端日志查询页面&am…