算法金 | 再见!!!K-means


大侠幸会,在下全网同名「算法金」

0 基础转 AI 上岸,多个算法赛 Top

「日更万日,让更多人享受智能乐趣」

今天我们来聊聊达叔 6 大核心算法之 —— k-means 算法。最早由斯坦福大学的 J. B. MacQueen 于 1967 年提出,后来经过许多研究者的改进和发展,成为了一种经典的聚类方法。吴恩达:机器学习的六个核心算法!

分几部分,拿下:

  • k-means 算法的基本原理和工作步骤
  • 相关的数学公式和代码示范
  • k-means 算法的优缺点
  • 误区和注意事项
  • k-means 算法的变种和改进
  • k-means 算法的实际应用
  • k-means 算法与其他聚类算法的对比

1. k-means 算法简介

什么是 k-means 算法

k-means 算法是一种用于聚类分析的非监督学习算法。它通过将数据点划分为 k 个簇,使得每个簇中的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这个算法的名称来源于其中的 k 个簇(clusters)和每个簇的均值(mean)。

k-means 算法的工作原理

k-means 算法的工作原理可以概括为以下几个步骤:

  1. 初始化中心点
  2. 分配样本到最近的中心点
  3. 更新中心点
  4. 迭代直到收敛

下面我们来浅浅的感受一下,走你~

2. k-means 算法的核心步骤

2.1 初始化中心点

在 k-means 算法中,第一步是随机选择 k 个点作为初始中心点。这个步骤非常重要,因为初始中心点的选择会影响最终聚类结果的好坏。如果初始中心点选择不当,可能会导致算法陷入局部最优解。

2.2 分配样本到最近的中心点

一旦初始中心点确定后,我们就可以开始分配样本了。对于每个数据点,我们计算它到所有中心点的距离,并将其分配到距离最近的中心点所属的簇中。通常情况下,我们使用欧氏距离来计算数据点之间的距离。

2.3 更新中心点

在所有数据点被分配到最近的中心点后,我们需要重新计算每个簇的中心点。新的中心点是簇中所有数据点的平均值。

2.4 迭代直到收敛

我们不断重复分配样本和更新中心点这两个步骤,直到中心点不再发生变化或达到预设的迭代次数为止。这时,算法就收敛了,簇的划分结果也就确定了。

下面,我们用一个结合武侠元素的数据集来演示 k-means 算法的核心步骤:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans# 生成武侠风格的数据集
np.random.seed(42)
data_A = np.random.normal(loc=[1, 1], scale=0.2, size=(50, 2))
data_B = np.random.normal(loc=[5, 5], scale=0.2, size=(50, 2))
data_C = np.random.normal(loc=[8, 1], scale=0.2, size=(50, 2))data = np.vstack((data_A, data_B, data_C))# 使用 k-means 算法进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(data)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_# 数据可视化
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', marker='o')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x')
plt.xlabel('武功')
plt.ylabel('内力')
plt.title('武侠数据集的聚类结果')
plt.show()

每天一个简单通透的小案例,如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

3. 数学公式和代码示范

3.1 距离度量公式

在 k-means 算法中,最常用的距离度量是欧氏距离。欧氏距离可以衡量两个数据点之间的相似程度,计算公式如下:

其他距离度量方式有,曼哈顿距离 (Manhattan Distance),切比雪夫距离 (Chebyshev Distance),闵可夫斯基距离 (Minkowski Distance)等

更多细节,见往期微*公号文章:再见!!!KNN

3.2 损失函数(目标函数)

k-means 算法的目标是最小化簇内数据点与中心点之间的总距离,即最小化下式:

感受一下

3.3 手撕 K means

下面我们用 Python 手动实现 k-means 算法,并通过可视化展示算法的效果。

import numpy as np
import matplotlib.pyplot as plt# 生成武侠风格的数据集
np.random.seed(7) # (彩蛋)42 是宇宙的答案
data_A = np.random.normal(loc=[1, 1], scale=0.2, size=(50, 2))
data_B = np.random.normal(loc=[5, 5], scale=0.2, size=(50, 2))
data_C = np.random.normal(loc=[8, 1], scale=0.2, size=(50, 2))data = np.vstack((data_A, data_B, data_C))def initialize_centroids(data, k):"""随机选择 k 个点作为初始中心点"""indices = np.random.choice(data.shape[0], k, replace=False)return data[indices]def assign_clusters(data, centroids):"""将每个数据点分配到最近的中心点"""distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)return np.argmin(distances, axis=1)def update_centroids(data, labels, k):"""重新计算每个簇的中心点"""new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])return new_centroidsdef kmeans(data, k, max_iters=100):"""k-means 算法"""centroids = initialize_centroids(data, k)for _ in range(max_iters):labels = assign_clusters(data, centroids)new_centroids = update_centroids(data, labels, k)if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn labels, centroids# 运行 k-means 算法
k = 3
labels, centroids = kmeans(data, k)# 数据可视化
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis', marker='o')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x')
plt.xlabel('武功')
plt.ylabel('内力')
plt.title('武侠数据集的聚类结果')
plt.show()

4. k-means 的优缺点

4.1 k-means 的优势

  1. 简单易懂:k-means 算法的概念和实现都非常简单,易于理解和应用。
  2. 计算效率高:由于算法的时间复杂度较低,k-means 适合处理大规模数据集。
  3. 结果直观:通过可视化,k-means 聚类结果清晰明了,容易解释。

4.2 k-means 的劣势

  1. 需要预设簇数 k:k-means 需要用户事先指定簇的数量 k,而在实际应用中,合适的 k 值往往很难确定。
  2. 对初始中心点敏感:k-means 对初始中心点的选择非常敏感,不同的初始中心点可能导致不同的聚类结果,甚至局部最优解。
  3. 只适用于凸形簇:k-means 假设簇是球形的,这使得它难以处理非凸形的簇结构。
  4. 受异常值影响大:异常值可能会显著影响中心点的计算,从而影响聚类结果。

5. 误区和注意事项

5.1 误区:选择 k 值的误区

一个常见的误区是随意选择 k 值。选择合适的 k 值对于 k-means 算法的效果至关重要。如果 k 过小,可能会导致欠拟合,无法捕捉数据中的全部信息;如果 k 过大,可能会导致过拟合,使得模型对数据的细节过于敏感。常用的方法有肘部法(Elbow Method)和轮廓系数法(Silhouette Score)来选择合适的 k 值。

肘部法(Elbow Method)

肘部法是一种常用的选择 k 值的方法。其基本思想是通过计算不同 k 值下的总误差平方和(SSE),绘制 SSE 随 k 值变化的曲线,当曲线出现“肘部”时,对应的 k 值即为最佳选择。SSE 随 k 值增加而递减,当 k 值达到某个临界点后,SSE 的减小速度明显减缓,这个临界点对应的 k 值就是肘部。

肘部法的步骤如下:

  1. 运行 k-means 算法,令 k 从 1 取到最大值。
  2. 计算每个 k 值对应的 SSE(误差平方和)。
  3. 绘制 k 值与 SSE 的关系图,找出肘部点。
from sklearn.cluster import KMeans
import matplotlib.pyplot as pltdef elbow_method(data, max_k):sse = []for k in range(1, max_k + 1):kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(data)sse.append(kmeans.inertia_)plt.plot(range(1, max_k + 1), sse, marker='o')plt.xlabel('簇数 (k)')plt.ylabel('SSE')plt.title('肘部法选择最佳 k 值')plt.show()# 使用肘部法选择最佳 k 值
elbow_method(data, 10)

轮廓系数法(Silhouette Score)

轮廓系数法通过计算数据点的轮廓系数来评估聚类结果的质量。轮廓系数介于 -1 和 1 之间,数值越大表示聚类效果越好。轮廓系数不仅考虑了同一簇内数据点的紧密程度,还考虑了不同簇之间的分离程度。

轮廓系数法的步骤如下:

  1. 运行 k-means 算法,令 k 从 2 取到最大值。
  2. 计算每个 k 值对应的平均轮廓系数。
  3. 绘制 k 值与平均轮廓系数的关系图,选择平均轮廓系数最高的 k 值。
from sklearn.metrics import silhouette_scoredef silhouette_method(data, max_k):silhouette_scores = []for k in range(2, max_k + 1):kmeans = KMeans(n_clusters=k, random_state=42)labels = kmeans.fit_predict(data)score = silhouette_score(data, labels)silhouette_scores.append(score)plt.plot(range(2, max_k + 1), silhouette_scores, marker='o')plt.xlabel('簇数 (k)')plt.ylabel('平均轮廓系数')plt.title('轮廓系数法选择最佳 k 值')plt.show()# 使用轮廓系数法选择最佳 k 值
silhouette_method(data, 10)

通过这两种方法,我们可以更加科学和合理地选择 k 值,从而提高 k-means 算法的聚类效果。

5.2 注意事项:数据标准化

在使用 k-means 算法之前,对数据进行标准化处理非常重要。由于不同特征的量纲不同,直接使用未标准化的数据会导致距离计算时某些特征的影响被放大。通常情况下,我们使用 z-score 标准化方法:

from sklearn.preprocessing import StandardScaler# 数据标准化
scaler = StandardScaler()
data_standardized = scaler.fit_transform(data)# 使用标准化后的数据进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(data_standardized)
centroids = kmeans.cluster_centers_# 数据可视化
plt.scatter(data_standardized[:, 0], data_standardized[:, 1], c=labels, cmap='viridis', marker='o')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x')
plt.xlabel('标准化后的武功')
plt.ylabel('标准化后的内力')
plt.title('标准化数据的聚类结果')
plt.show()

5.3 误区:初始中心点选择的重要性

有些铁子们可能会忽略初始中心点的选择,直接使用默认的随机初始化。其实,初始中心点的选择会显著影响聚类结果。为了避免局部最优解,我们可以使用 k-means++ 算法进行初始化,这样可以有效提高算法的稳定性和收敛速度。

# 使用 k-means++ 初始化进行聚类
kmeans_pp = KMeans(n_clusters=3, init='k-means++', random_state=42)
labels_pp = kmeans_pp.fit_predict(data)
centroids_pp = kmeans_pp.cluster_centers_# 数据可视化
plt.scatter(data[:, 0], data[:, 1], c=labels_pp, cmap='viridis', marker='o')
plt.scatter(centroids_pp[:, 0], centroids_pp[:, 1], c='red', marker='x')
plt.xlabel('武功')
plt.ylabel('内力')
plt.title('k-means++ 初始化的聚类结果')
plt.show()

5.4 注意事项:避免局部最优解

为了进一步避免陷入局部最优解,可以多次运行 k-means 算法,并选择最优的聚类结果。这样做可以显著提高最终结果的稳定性和准确性。

# 多次运行 k-means 算法并选择最优结果
best_inertia = np.inf
best_labels = None
best_centroids = Nonefor _ in range(10):kmeans = KMeans(n_clusters=3, random_state=42)labels = kmeans.fit_predict(data)if kmeans.inertia_ < best_inertia:best_inertia = kmeans.inertia_best_labels = labelsbest_centroids = kmeans.cluster_centers_# 数据可视化
plt.scatter(data[:, 0], data[:, 1], c=best_labels, cmap='viridis', marker='o')
plt.scatter(best_centroids[:, 0], best_centroids[:, 1], c='red', marker='x')
plt.xlabel('武功')
plt.ylabel('内力')
plt.title('多次运行后的最佳聚类结果')
plt.show()

6. k-means 算法的变种和改进

6.1 k-means++ 算法

k-means++ 是 k-means 算法的一种改进版本,旨在通过一种更巧妙的初始中心点选择方法来提高算法的稳定性和收敛速度。k-means++ 的核心思想是在选择初始中心点时,让新的中心点尽可能远离已选择的中心点,从而减少随机初始化带来的不稳定性。

k-means++ 初始化步骤:

  1. 随机选择一个数据点作为第一个中心点。
  2. 对于每一个数据点 𝑥𝑥,计算它到最近已选中心点的距离 𝐷(𝑥)𝐷(𝑥)。
  3. 根据 𝐷(𝑥)𝐷(𝑥) 的概率分布随机选择下一个中心点,选择概率与 𝐷(𝑥)𝐷(𝑥) 正相关。
  4. 重复步骤 2 和 3,直到选择出 k 个中心点。

6.2 Mini-Batch k-means

Mini-Batch k-means 是 k-means 的另一个改进版本,适用于大规模数据集。它通过使用小批量的数据进行迭代,减少了每次迭代的计算量,从而大大加快了聚类速度。Mini-Batch k-means 的核心思想是每次仅随机选取一部分数据进行中心点的更新。

6.3 其他变种

除了 k-means++ 和 Mini-Batch k-means 之外,还有许多 k-means 的变种和改进算法,例如:

  1. Bisecting k-means:通过递归地将数据集分成两部分来进行聚类,适用于层次聚类。
  2. Fuzzy k-means:允许一个数据点属于多个簇,通过模糊隶属度来表示,适用于模糊聚类。
  3. Kernel k-means:通过使用核函数将数据映射到高维空间进行聚类,适用于非线性数据。

这些改进算法在不同的应用场景中具有各自的优势,可以根据具体需求选择合适的算法。

7. k-means 算法的应用和案例

7.1 图像压缩

k-means 算法在图像压缩中的应用非常广泛。通过将图像中的像素点聚类为 k 个颜色簇,可以有效减少图像的颜色数量,从而实现图像压缩。下面是一个使用 k-means 进行图像压缩的示例。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from skimage import io# 读取图像
image = io.imread('https://example.com/image.jpg')
image = np.array(image, dtype=np.float64) / 255# 将图像数据重塑为二维数组
w, h, d = image.shape
image_array = np.reshape(image, (w * h, d))# 使用 k-means 进行图像压缩
kmeans = KMeans(n_clusters=16, random_state=42).fit(image_array)
labels = kmeans.predict(image_array)
compressed_image = kmeans.cluster_centers_[labels].reshape(w, h, d)# 显示原始图像和压缩后的图像
fig, ax = plt.subplots(1, 2, figsize=(12, 6), subplot_kw={'xticks': [], 'yticks': []})
ax[0].imshow(image)
ax[0].set_title('原始图像')
ax[1].imshow(compressed_image)
ax[1].set_title('压缩图像')
plt.show()

7.2 客户分群

在市场营销中,k-means 算法可以用来对客户进行分群,从而更好地制定营销策略。通过分析客户的消费行为、偏好等特征,将客户分成不同的群体,有助于企业针对不同客户群体制定个性化的营销方案。

7.3 其他实际应用

除了图像压缩和客户分群,k-means 算法在其他领域也有广泛的应用,例如:

  1. 文档分类:将文档聚类为不同的主题,有助于文档的自动归档和检索。
  2. 城市规划:根据居民的地理位置和人口密度,将城市划分为不同的区域,优化城市资源配置。
  3. 基因表达分析:在生物信息学中,k-means 用于分析基因表达数据,找出具有相似表达模式的基因群体。

通过这些实际应用的案例,可以看出 k-means 算法在不同领域的强大实用性。

8. 横向对比:k-means 与其他聚类算法

8.1 k-means vs. 层次聚类

原理

  • k-means:通过迭代优化中心点来最小化簇内平方误差。
  • 层次聚类:通过构建树状结构(树状图)来逐步聚合或拆分数据点。

适用场景

  • k-means:适用于大规模数据,且簇的形状是球形的情况。
  • 层次聚类:适用于小规模数据,且需要层次结构或簇的形状不规则的情况。

优缺点对比

  • k-means:计算速度快,但对初始点敏感,适合处理大数据。
  • 层次聚类:无需预设簇数,但计算复杂度高,不适合大数据。

8.2 k-means vs. DBSCAN

原理

  • k-means:基于均值和距离的聚类算法。
  • DBSCAN:基于密度的聚类算法,通过寻找高密度区域形成簇。

适用场景

  • k-means:适用于数据均匀分布的情况。
  • DBSCAN:适用于簇形状不规则且有噪声的数据。

优缺点对比

  • k-means:需要预设簇数,对异常值敏感。
  • DBSCAN:无需预设簇数,能识别噪声,但参数选择困难。

8.3 k-means vs. GMM

原理

  • k-means:通过最小化簇内平方误差进行聚类。
  • GMM (高斯混合模型):假设数据由多个高斯分布组成,通过期望最大化(EM)算法进行聚类。

适用场景

  • k-means:适用于簇形状均匀的数据。
  • GMM:适用于簇形状复杂的数据,能够处理概率归属问题。

优缺点对比

  • k-means:简单高效,但对簇形状有假设限制。
  • GMM:灵活性高,但计算复杂度高,需要选择适当的高斯分布数量。

通过这些对比,我们可以看到不同聚类算法在不同应用场景下的优缺点,选择合适的算法可以更好地解决具体问题。

[ 抱个拳,总个结 ]

  • 了解了 k-means 算法的基本概念、工作原理和应用场景。
  • 学习了 k-means 算法的核心步骤,包括初始化中心点、分配样本、更新中心点和迭代直到收敛。
  • 掌握了 k-means 算法的数学公式,如欧氏距离和损失函数,通过代码示例加深理解。
  • 分析了 k-means 的优缺点,强调了选择合适 k 值和数据标准化的重要性。
  • 探讨了 k-means 算法的变种和改进,如 k-means++ 和 Mini-Batch k-means。
  • 通过图像压缩和客户分群等案例展示了 k-means 的实际应用效果。
  • 比较了 k-means 与其他聚类算法(如层次聚类、DBSCAN 和 GMM),帮助理解不同算法的适用场景和优缺点。

希望通过这篇文章,大家能对 k-means 算法有一个全面的认识,并掌握其实际应用的方法。如果你有任何疑问或需要进一步探讨,欢迎随时留言交流。

吴恩达:机器学习的六个核心算法!

回归算法,逻辑回归,决策树算法, 神经网络,K-means(本文),梯度下降(TODO,催更请留言)

- 科研为国分忧,创新与民造福 -

日更时间紧任务急,难免有疏漏之处,还请大侠海涵

内容仅供学习交流之用,部分素材来自网络,侵联删

[ 算法金,碎碎念 ]

全网同名,日更万日,让更多人享受智能乐趣

如果觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;

同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖

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

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

相关文章

进口二手RS FSH4规格3.6G罗德与施瓦茨 FSH6参数

Rohde & Schwarz FSH4 的规格包括&#xff1a; 频率范围从 9 kHz 到 3.6 GHz 高灵敏度&#xff08;<-141dBm&#xff08;1Hz&#xff09;&#xff0c;或使用可选前置放大器<-161dBm&#xff08;1Hz&#xff09;&#xff09; 低测量不确定度&#xff08; 内部跟踪发生…

SpringCloud 前端-网关-微服务-微服务间实现信息共享传递

目录 1 网关获取用户校验信息并保存至请求头&#xff08;前端-网关&#xff09; 2 微服务获取网关中的用户校验信息&#xff08;网关-微服务&#xff09; 2.1 一般的做法是在公共的module中添加&#xff0c;此处示例为common 公共配置module中添加 2.2 定义拦截器 2.3 定义…

简易五子棋

简介 使用Java实现简易五子棋 规则介绍 游戏使用一个标准的1515方格的棋盘&#xff0c;双方分别用黑白两种颜色的棋子进行对战。黑子先行&#xff0c;双方轮流在空棋盘的交叉点上落子&#xff0c;每人一次只能落一子。游戏的目标是让自己的五颗棋子连成一线&#xff0c;这条…

一分钟制作爆火的治愈插画,让插画来替你说出心声

超火的AI治愈插画来了&#xff0c;有趣的文字搭配上有趣的图&#xff0c;无论是发朋友圈还是发小红书&#xff0c;这效果简直无敌。 下面是我刚生成的&#xff0c;快来看看效果吧。 这个工具&#xff0c;国内可用&#xff0c;可以直接上手&#xff0c;不需要什么技术&#xff0…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0

1.stablediffusion的概述&#xff1a; Stable Diffusion&#xff08;简称SD&#xff09;近期的动态确实不多&#xff0c;但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新&#xff0c;但它们在SD3面前似乎略显黯然。就在昨晚&#x…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐的服务交换接口失败率分析 (100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 K小姐的服务交换接口失败率分析(100分) 🌍 评测功能需要订…

基于.Net 框架实现WebSocket 简单通信——服务端

新建项目 创建一个.Net 框架的控制台程序。 添加包 项目 → 管理 NuGet 程序包打开包管理窗口&#xff0c;添加SuperWebSocket 程序包。 实现 项目 → 添加类打开添加新项窗口&#xff0c;添加一个C#类。 启动监听 WebSocketServer socket new WebSocketServer();Conso…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

(金融:货币兑换)编写一个程序,提示用户输入从美元到人民币的兑换汇率。

&#xff08;金融:货币兑换)编写一个程序&#xff0c;提示用户输入从美元到人民币的兑换汇率。提示用户输入0表示从美元兑换为人民币&#xff0c;输入1表示从人民币兑换为美元。继而提示用户输入美元数量或者人民币数量&#xff0c;分别兑换为另外一种货币。下面是运行示例: pa…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP&#xff08;传输控制协议/网际协议&#xff09;是…

LeetCode 2813.子序列最大优雅度

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories^2 计算&#xff0c;其中 t…

通勤路上的美好伴侣:倍思H1s头戴式蓝牙耳机

在繁忙的都市生活中,通勤往往占据了人们大量的时间。而在这个过程中,无尽的嘈杂声——公交车的播报声、地铁的轰鸣声、街头的喧嚣——往往成为我们心情的干扰源。在这样的环境下,一款优质的头戴式蓝牙耳机,会让我们的通勤之旅变得更加愉快和舒适。 通勤路上要更舒适—— 倍思…

LDR6023S:革新USB Type-C接口的完美伴侣

一、引言 随着科技的发展&#xff0c;USB Type-C接口以其高速传输、正反插等特性逐渐取代了传统的USB接口。而在这一背景下&#xff0c;LDR6023S作为一款USB Type-C转音频快充芯片&#xff0c;凭借其卓越的性能和广泛的应用场景&#xff0c;成为了市场上备受瞩目的产品。本文将…

西门子PLC位逻辑指令学习(SCL语言)

R_TRIG 参数 功能 当CLK信号出现一个低电平到高电平的跳变时&#xff0c;输出Q导通一个周期。 实例 定义以下类型变量 "R_TRIG_DB"(CLK:"data".source,Q>"data".result); //当source输入出现低电平到高电平跳变&#xff0c;result信号…

「计算机网络」初识http协议

前言 HTTP协议——互联网发展的基石&#xff0c;从一个最简单的“helloworld”网页&#xff0c;到现在博客平台、视频网站都离不开HTTP协议的存在。随着互联网的发展&#xff0c;Web网页的设计也越发复杂&#xff0c;前后端开发的分工也越发明确&#xff0c;HTTP作为连接前后端…

基于YOLO检测算法(单检测器网络+多视频输入)设计与实现

在单摄像头目标检测的基础上&#xff0c;实现单网络多线程的实时目标检测。 1&#xff0c;应用场景 在安防领域&#xff0c;YOLO的多摄像头实时目标检测应用具有以下特点和优势&#xff1a; 实时性能&#xff1a; YOLO算法以非常高的速度运行&#xff0c;能够实现实时目标检测…

力扣刷题--2843. 统计对称整数的数目【简单】

题目描述 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x &#xff0c;如果其前 n 位数字之和与后 n 位数字之和相等&#xff0c;则认为这个数字是一个对称整数。 返回在 [low, high] 范围内的 对称整数的数目 。 示例 1&#xff1a; 输入&#xff1…

pytest + yaml 框架 - 65.Pycharm 设置 yaml 格式用例模板,高效写用例

前言 初学者对yaml 格式不太熟悉,自己写yaml用例的时候,总是格式对不齐,或者有些关键字会忘记。 于是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm设置用例模板 File - Settings Live Templates - python 点 + 号…