
在讲什么是K-Means时,我们先来讲一个和我们息息相关的小例子,想象一下,我们刚从一个超市回来,买了一大袋杂货零食。然后把这些东西一股脑儿全都倒在了桌子上,现在桌上一片混乱:有苹果、橙子、罐头、饼干、薯片等等。看着有点乱,我们想给他整理一下,放到三个零食收纳盒里去,今天我们当一个精致的收纳小能手,让这个分类变的有意义一点,首先我们不会一眼就精准地分出三堆,常规的操作过程,看看我们会如何去完成。

第一步:随机初始化
首先我们并不知道最终的三堆应该是什么。所以得随机地从桌上抓起三样东西作为“代表”,比如刚好抓了一个苹果、一个罐头和一包薯片。
这一步好比 KMeans 随机选择 K 个点作为初始质心。
第二步:分配步骤
现在,我们开始整理桌上的每一件商品。对于每一件商品,都会做一个决定:
我们重复这个过程,直到桌上的每一件商品都被分配到了三堆中的某一堆里。
这一步好比 KMeans 计算每个数据点到各个质心的距离,并将其分配到最近的质心所在的簇。

第三步:更新步骤
现在,所有商品都分完了,但每个分类的代表还是最初随机抓的那三样。这显然不准确。比如第一堆里现在有很多水果(苹果、橙子、香蕉),但代表只有一个苹果。
所以,我们重新定义每一堆的“代表”。
这一步好比 KMeans 重新计算每个簇的质心,取簇内所有点的平均值。
第四步:迭代与收敛
我们仔细观察后发现,因为代表变了,之前的一些分配现在看起来可能不太对了。
经过不断地重复“分配”和“更新代表”这两个步骤,直到后来发现,无论我们再怎么检查,所有商品都已经待在它最该待的那一堆里了,代表的定义也不再发生变化。
此时,算法收敛,任务完成! 我们成功地将杂乱的商品分成了三个有意义的簇:
我们以上的做法就和 KMeans 算法一模一样,通过这个例子,我们可以理解 K-Means 的这几个核心特性和挑战:
所以,K-Means 的本质就是一个自动化的“归纳整理”工具,它试图在数据中找到最自然的分组,让组内成员尽可能相似,组间成员尽可能不同。
简洁的流程图理解:

这个流程图直观地展示了 K-Means 算法的核心思想:通过不断迭代"分配-更新"两个步骤,逐步优化分组结果,直到达到稳定状态。
结合例子对Kmeans的流程总结:
通过例子引出来的算法术语:
K-Means 算法术语 | 通俗例子对应 |
|---|---|
数据点 | 杂货商品 |
簇 | 商品堆 |
质心 | 堆的代表概念 |
距离度量 | 相似度比较 |
分配步骤 | 将商品分配到最相似的堆 |
更新步骤 | 重新定义每堆的代表概念 |
收敛 | 所有商品都在最合适的堆中 |
K-Means 是一种无监督的聚类算法,用于将未标记的数据点自动分组到 K 个簇中。它的核心思想是让同一个簇内的点尽可能相似,不同簇的点尽可能不同。就是我们经常提到的高内聚、低耦合。
“相似”在这里通常由欧氏距离来衡量。一个簇的“中心”由该簇内所有数据点的均值计算得出,这也是算法名称中 “Means” (均值) 的由来。
形象比喻:假设你有一堆散落的糖果,你的目标是把它们按颜色分成 K 个组。
K-Means 的做法是:

输入:
输出:
第一步:初始化中心点
第二步:分配步骤
对于数据集中的每一个数据点 x_i:
用数学公式表示就是,为每个点找到 j,使得:
距离²(x_i, center_j) ≤ 距离²(x_i, center_k) 对于所有 k
这一步结束后,所有数据点都被分配到了 K 个簇中的某一个。
第三步:更新步骤
对于每一个簇 C_j:
计算公式:新中心点 = (1 / 簇中点数) × 所有点的坐标和
第四步:收敛判断
检查簇中心是否发生变化:
如果中心点变化显著,则返回第 2 步继续迭代。
算法关键点说明:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 生成示例数据
np.random.seed(42)
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.8, random_state=42)
# K-Means 算法实现
def k_means(X, k, max_iter=100, tol=1e-4):
# 1. 初始化中心点
centers = X[np.random.choice(X.shape[0], k, replace=False)]
# 存储历史信息用于可视化
history = {'centers': [centers.copy()], 'labels': []}
for i in range(max_iter):
# 2. 分配步骤
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
history['labels'].append(labels.copy())
# 3. 更新步骤
new_centers = np.array([X[labels == j].mean(axis=0) for j in range(k)])
# 4. 收敛判断
if np.all(np.linalg.norm(new_centers - centers, axis=1) < tol):
break
centers = new_centers
history['centers'].append(centers.copy())
return labels, centers, history
# 应用 K-Means 算法
k = 4
labels, centers, history = k_means(X, k)
# 可视化结果
plt.figure(figsize=(15, 10))
# 绘制初始状态
plt.subplot(2, 3, 1)
plt.scatter(X[:, 0], X[:, 1], c='gray', s=30, alpha=0.5)
plt.scatter(history['centers'][0][:, 0], history['centers'][0][:, 1],
c='red', s=100, marker='X')
plt.title('初始化: 随机选择中心点')
# 绘制迭代过程
for i in range(min(4, len(history['labels']))):
plt.subplot(2, 3, i+2)
for j in range(k):
cluster_points = X[history['labels'][i] == j]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], s=30, alpha=0.5)
plt.scatter(history['centers'][i][:, 0], history['centers'][i][:, 1],
c='red', s=100, marker='X')
plt.scatter(history['centers'][i+1][:, 0], history['centers'][i+1][:, 1],
c='green', s=100, marker='X')
plt.title(f'迭代 {i+1}: 分配和更新中心点')
# 绘制最终结果
plt.subplot(2, 3, 6)
for j in range(k):
cluster_points = X[labels == j]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], s=30, alpha=0.5)
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=100, marker='X')
plt.title('最终结果: 算法收敛')
plt.tight_layout()
plt.show()
# 打印最终中心点位置
print("最终中心点位置:")
for i, center in enumerate(centers):
print(f"中心点 {i+1}: ({center[0]:.2f}, {center[1]:.2f})")最终中心点位置: 中心点 1: (4.30, 2.38) 中心点 2: (-6.84, -6.84) 中心点 3: (5.33, 1.48) 中心点 4: (-5.74, 8.10)

K-Means 算法的核心是在优化一个目标函数,这个函数称为簇内误差平方和(WCSS),也叫畸变值。目标函数衡量的是所有数据点与其所属簇中心的距离平方之和。公式表示为:
总误差 = 所有簇中 [每个点到其簇中心距离的平方] 的总和
这个值越小,说明聚类效果越好,因为点都紧密地聚集在各自的簇中心周围。
K-Means 通过两个交替步骤来优化这个目标函数:
算法保证在每次迭代中,总误差值都会减小或保持不变,最终会收敛到一个局部最优解。
K-Means 算法对初始中心点的选择非常敏感。随机选择初始中心点可能导致:
解决方案:K-Means++ 初始化方法
K-Means++ 是一种更聪明的初始化方法,它使初始中心点彼此远离,从而提高聚类效果。
K-Means++ 的步骤:
K-Means++ 的优势:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 生成示例数据
np.random.seed(42)
X = np.random.randn(300, 2)
# 自己实现 K-Means 算法
def kmeans(X, k, init_method='random', max_iter=100, tol=1e-4):
n_samples, n_features = X.shape
# 初始化中心点
if init_method == 'random':
# 随机初始化
centers = X[np.random.choice(n_samples, k, replace=False)]
elif init_method == 'kmeans++':
# K-Means++ 初始化
centers = np.zeros((k, n_features))
# 第一个中心点随机选择
centers[0] = X[np.random.randint(n_samples)]
for i in range(1, k):
# 计算每个点到最近中心点的距离
distances = np.min(np.sqrt(((X - centers[:i, np.newaxis])**2).sum(axis=2)), axis=0)
# 按距离平方的概率选择下一个中心点
probabilities = distances**2 / np.sum(distances**2)
next_center_idx = np.random.choice(n_samples, p=probabilities)
centers[i] = X[next_center_idx]
# 存储历史信息
history = {'centers': [centers.copy()], 'labels': [], 'wcss': []}
for iteration in range(max_iter):
# 计算每个点到每个中心的距离
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
# 分配步骤:将每个点分配到最近的中心
labels = np.argmin(distances, axis=0)
history['labels'].append(labels.copy())
# 计算 WCSS (Within-Cluster Sum of Squares)
wcss = 0
for j in range(k):
cluster_points = X[labels == j]
if len(cluster_points) > 0:
wcss += np.sum((cluster_points - centers[j])**2)
history['wcss'].append(wcss)
# 更新步骤:重新计算中心点
new_centers = np.zeros((k, n_features))
for j in range(k):
cluster_points = X[labels == j]
if len(cluster_points) > 0:
new_centers[j] = np.mean(cluster_points, axis=0)
else:
# 如果簇为空,重新初始化该中心点
new_centers[j] = X[np.random.randint(n_samples)]
# 检查收敛
if np.all(np.linalg.norm(new_centers - centers, axis=1) < tol):
break
centers = new_centers
history['centers'].append(centers.copy())
return labels, centers, history
# 运行随机初始化的 K-Means
labels_random, centers_random, history_random = kmeans(X, k=4, init_method='random')
wcss_random = history_random['wcss'][-1]
# 运行 K-Means++ 初始化的 K-Means
labels_plus, centers_plus, history_plus = kmeans(X, k=4, init_method='kmeans++')
wcss_plus = history_plus['wcss'][-1]
print(f"随机初始化的误差: {wcss_random:.2f}")
print(f"K-Means++ 初始化的误差: {wcss_plus:.2f}")
print(f"改进: {wcss_random - wcss_plus:.2f} (越小越好)")
# 可视化结果
plt.figure(figsize=(15, 5))
# 随机初始化的结果
plt.subplot(1, 3, 1)
colors = list(mcolors.TABLEAU_COLORS.values())
for j in range(4):
cluster_points = X[labels_random == j]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], c=colors[j], s=30, alpha=0.8)
plt.scatter(centers_random[:, 0], centers_random[:, 1], c='red', marker='X', s=200, edgecolors='black')
plt.title('随机初始化\n误差: {:.2f}'.format(wcss_random))
# K-Means++ 初始化的结果
plt.subplot(1, 3, 2)
for j in range(4):
cluster_points = X[labels_plus == j]
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], c=colors[j], s=30, alpha=0.8)
plt.scatter(centers_plus[:, 0], centers_plus[:, 1], c='red', marker='X', s=200, edgecolors='black')
plt.title('K-Means++ 初始化\n误差: {:.2f}'.format(wcss_plus))
# 误差对比
plt.subplot(1, 3, 3)
methods = ['随机初始化', 'K-Means++']
wcss_values = [wcss_random, wcss_plus]
bars = plt.bar(methods, wcss_values, color=['lightblue', 'lightgreen'])
plt.ylabel('WCSS 误差')
plt.title('初始化方法对比')
# 在柱状图上添加数值标签
for bar, value in zip(bars, wcss_values):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 5,
f'{value:.2f}', ha='center', va='bottom')
plt.tight_layout()
plt.show()
# 打印迭代次数和最终中心点
print(f"\n随机初始化迭代次数: {len(history_random['wcss'])}")
print(f"K-Means++ 迭代次数: {len(history_plus['wcss'])}")
print("\n随机初始化最终中心点:")
for i, center in enumerate(centers_random):
print(f"中心点 {i+1}: ({center[0]:.2f}, {center[1]:.2f})")
print("\nK-Means++ 最终中心点:")
for i, center in enumerate(centers_plus):
print(f"中心点 {i+1}: ({center[0]:.2f}, {center[1]:.2f})")随机初始化的误差: 201.79 K-Means++ 初始化的误差: 195.35 改进: 6.45 (越小越好)

大模型强大但昂贵且缓慢。K-Means 作为一种轻量级、高效的聚类算法,可以与大模型协同工作,主要在以下几个层面发挥作用:
以下是一个完整的示例,展示了如何将文本数据通过 Sentence Transformer 转换为嵌入向量,然后用 K-Means 进行聚类,最后使用Qwen模型的API来分析每个簇的主题。
import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import requests
import json
import os
import time
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 1. 准备中文新闻标题数据
news_titles = [
"股市在经济复苏中创历史新高",
"新研究显示地中海饮食对心脏健康的益处",
"地方选举结果公布,现任政党保持席位",
"科技巨头发布具有先进AI功能的最新智能手机",
"科学家在亚马逊雨林发现新物种",
"美联储暗示下季度可能降息",
"COVID-19疫苗加强针现已向所有成年人开放",
"足球队在戏剧性决赛后赢得冠军",
"气候峰会达成碳排放新协议",
"苹果发布改进相机系统的新iPhone",
"央行宣布新货币政策以遏制通胀",
"研究将空气污染与痴呆症风险增加联系起来",
"市议会批准新公共交通系统预算",
"三星推出新款可折叠手机参与市场竞争",
"当地公园发现稀有鸟类,观鸟者蜂拥而至",
"财政部长评论数字货币未来",
"癌症治疗突破在临床试验中显示希望",
"市长候选人承诺解决无家可归危机",
"谷歌发布搜索算法更新",
"飓风逼近海岸,居民被敦促撤离"
]
# 2. 加载嵌入模型
embedder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') # 多语言模型,支持中文
# 3. 将文本转换为嵌入向量
corpus_embeddings = embedder.encode(news_titles)
# 4. 自己实现 K-Means 算法,避免使用 sklearn
def kmeans_custom(X, n_clusters, max_iter=100, tol=1e-4):
# 随机初始化中心点
centers = X[np.random.choice(X.shape[0], n_clusters, replace=False)]
for _ in range(max_iter):
# 计算每个点到每个中心的距离
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
# 分配步骤:将每个点分配到最近的中心
labels = np.argmin(distances, axis=0)
# 更新步骤:重新计算中心点
new_centers = np.array([X[labels == j].mean(axis=0) for j in range(n_clusters)])
# 检查收敛
if np.all(np.linalg.norm(new_centers - centers, axis=1) < tol):
break
centers = new_centers
return labels, centers
# 使用自定义 K-Means 进行聚类
num_clusters = 5 # 假设有5个主要类别
clusters, centers = kmeans_custom(corpus_embeddings, num_clusters)
# 5. 可视化(使用PCA将高维向量降维到2D)
pca = PCA(n_components=2)
reduced_embeddings = pca.fit_transform(corpus_embeddings)
# 计算每个簇在2D空间中的中心点
cluster_centers_2d = []
for i in range(num_clusters):
cluster_points = reduced_embeddings[clusters == i]
if len(cluster_points) > 0:
center_2d = np.mean(cluster_points, axis=0)
cluster_centers_2d.append(center_2d)
else:
cluster_centers_2d.append([0, 0])
# 6. 打印聚类结果
clustered_titles = {}
for idx, cluster_id in enumerate(clusters):
if cluster_id not in clustered_titles:
clustered_titles[cluster_id] = []
clustered_titles[cluster_id].append(news_titles[idx])
print("=== 聚类结果 ===")
for cluster_id, titles in clustered_titles.items():
print(f"\n--- 簇 #{cluster_id} (包含 {len(titles)} 个标题) ---")
for title in titles:
print(f" - {title}")
# 7. 使用 Qwen API 总结每个簇的主题
# 设置你的 Qwen API 密钥和端点
QWEN_API_KEY = os.environ.get("DASHSCOPE_API_KEY")
QWEN_API_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
def summarize_cluster_with_qwen(titles):
"""使用 Qwen API 总结一个簇的主题"""
# 构建提示词 - 使用字符串连接而不是 f-string 中的反斜杠
prompt_lines = [
"以下是一组被算法归为一类的新闻标题。",
"请分析它们的共同主题或话题,并用非常简短的中文标签(3-5个词)进行概括。",
"",
"新闻标题:"
]
prompt_lines.extend(titles[:3]) # 只使用前3个标题
prompt_lines.extend(["", "共同主题:", ""])
prompt = "\n".join(prompt_lines)
try:
# 构建请求
headers = {
"Authorization": f"Bearer {QWEN_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "qwen-max", # 使用 Qwen 模型
"input": {
"messages": [
{
"role": "user",
"content": prompt
}
]
},
"parameters": {
"max_tokens": 20,
"temperature": 0.1
}
}
# 发送请求
response = requests.post(QWEN_API_URL, headers=headers, data=json.dumps(payload))
result = response.json()
# 提取回复内容
if "output" in result and "text" in result["output"]:
return result["output"]["text"].strip()
else:
return f"API 错误: {result.get('message', '未知错误')}"
except Exception as e:
return f"请求异常: {str(e)}"
print("\n=== 正在生成簇主题... ===")
cluster_themes = {}
for cluster_id, titles in clustered_titles.items():
print(f"正在分析簇 #{cluster_id}...")
theme = summarize_cluster_with_qwen(titles)
cluster_themes[cluster_id] = theme
print(f"簇 #{cluster_id} 主题: {theme}")
# 添加短暂延迟以避免API限制
time.sleep(1)
# 8. 创建带有主题标签的可视化
plt.figure(figsize=(14, 10))
scatter = plt.scatter(reduced_embeddings[:, 0], reduced_embeddings[:, 1],
c=clusters, cmap='viridis', s=100, alpha=0.7)
plt.colorbar(scatter, label='簇 ID')
plt.title('新闻标题的 K-Means 聚类分析 (带主题标签)', fontsize=16)
# 为每个点添加标题索引
for i, title in enumerate(news_titles):
plt.annotate(f"{i}", (reduced_embeddings[i, 0], reduced_embeddings[i, 1]),
fontsize=8, alpha=0.7)
# 为每个簇添加主题标签
for cluster_id, center_2d in enumerate(cluster_centers_2d):
if cluster_id in cluster_themes:
theme = cluster_themes[cluster_id]
# 计算标签位置(稍微偏移以避免重叠)
offset_x = 0.5 if cluster_id % 2 == 0 else -0.5
offset_y = 0.5 if cluster_id < 3 else -0.5
plt.annotate(
f"簇 #{cluster_id}: {theme}",
xy=center_2d,
xytext=(center_2d[0] + offset_x, center_2d[1] + offset_y),
fontsize=12,
weight='bold',
color='darkred',
arrowprops=dict(arrowstyle="->", color='red', lw=1.5),
bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.3)
)
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# 9. 打印详细的聚类结果
print("\n=== 详细聚类结果 ===")
for cluster_id, titles in clustered_titles.items():
theme = cluster_themes.get(cluster_id, "未生成主题")
print(f"\n--- 簇 #{cluster_id}: {theme} (包含 {len(titles)} 个标题) ---")
for i, title in enumerate(titles):
print(f" {i+1}. {title}")
print("\n聚类分析完成!")输出结果:
=== 聚类结果 ===
--- 簇 #1 (包含 4 个标题) --- - 股市在经济复苏中创历史新高 - 地方选举结果公布,现任政党保持席位 - 足球队在戏剧性决赛后赢得冠军 - 气候峰会达成碳排放新协议
--- 簇 #3 (包含 3 个标题) --- - 新研究显示地中海饮食对心脏健康的益处 - 癌症治疗突破在临床试验中显示希望 - 飓风逼近海岸,居民被敦促撤离
--- 簇 #2 (包含 8 个标题) --- - 科技巨头发布具有先进AI功能的最新智能手机 - 科学家在亚马逊雨林发现新物种 - COVID-19疫苗加强针现已向所有成年人开放 - 苹果发布改进相机系统的新iPhone - 三星推出新款可折叠手机参与市场竞争 - 当地公园发现稀有鸟类,观鸟者蜂拥而至 - 市长候选人承诺解决无家可归危机 - 谷歌发布搜索算法更新
--- 簇 #0 (包含 4 个标题) --- - 美联储暗示下季度可能降息 - 央行宣布新货币政策以遏制通胀 - 市议会批准新公共交通系统预算 - 财政部长评论数字货币未来
--- 簇 #4 (包含 1 个标题) --- - 研究将空气污染与痴呆症风险增加联系起来
=== 正在生成簇主题... === 正在分析簇 #1... 簇 #1 主题: 无明显共同主题
这些新闻标题分别涉及股市、政治选举和体育赛事,看起来没有 正在分析簇 #3... 簇 #3 主题: 健康与安全 正在分析簇 #2... 簇 #2 主题: 无明显共同主题
这些新闻标题分别涉及科技产品发布、自然发现以及公共卫生更新, 正在分析簇 #0... 簇 #0 主题: 经济政策调整 正在分析簇 #4... 簇 #4 主题: 空气污染与健康
=== 详细聚类结果 ===
--- 簇 #1: 无明显共同主题
这些新闻标题分别涉及股市、政治选举和体育赛事,看起来没有 (包含 4 个标题) --- 1. 股市在经济复苏中创历史新高 2. 地方选举结果公布,现任政党保持席位 3. 足球队在戏剧性决赛后赢得冠军 4. 气候峰会达成碳排放新协议
--- 簇 #3: 健康与安全 (包含 3 个标题) --- 1. 新研究显示地中海饮食对心脏健康的益处 2. 癌症治疗突破在临床试验中显示希望 3. 飓风逼近海岸,居民被敦促撤离
--- 簇 #2: 无明显共同主题
这些新闻标题分别涉及科技产品发布、自然发现以及公共卫生更新, (包含 8 个标题) --- 1. 科技巨头发布具有先进AI功能的最新智能手机 2. 科学家在亚马逊雨林发现新物种 3. COVID-19疫苗加强针现已向所有成年人开放 4. 苹果发布改进相机系统的新iPhone 5. 三星推出新款可折叠手机参与市场竞争 6. 当地公园发现稀有鸟类,观鸟者蜂拥而至 7. 市长候选人承诺解决无家可归危机 8. 谷歌发布搜索算法更新
--- 簇 #0: 经济政策调整 (包含 4 个标题) --- 1. 美联储暗示下季度可能降息 2. 央行宣布新货币政策以遏制通胀 3. 市议会批准新公共交通系统预算 4. 财政部长评论数字货币未来
--- 簇 #4: 空气污染与健康 (包含 1 个标题) --- 1. 研究将空气污染与痴呆症风险增加联系起来
聚类分析完成!

K-Means作为最经典和广泛使用的聚类算法,以其简单性和效率在数据科学中占据重要地位。尽管有其局限性,但通过合理的初始化方法、参数调优和与大模型的结合,K-Means仍然能够解决许多实际聚类问题。
与大型语言模型的结合代表了现代AI应用的一个重要方向,其中K-Means负责高效处理和大规模模式识别,而大模型负责深度的语义理解和内容生成,二者优势互补,构建出更加智能和高效的AI系统。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。