AI 入门 30 天挑战 - Day 5 费曼学习法版 K-means 聚类
🌟 完整项目和代码
本教程是 AI 入门 30 天挑战 系列的一部分!
- 💻 GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge
- 📖 CSDN 专栏: https://blog.csdn.net/m0_67081842?type=blog
- ⭐ 欢迎 Star 支持!
今天学习 K-means 聚类(无监督学习)!
没有答案也能学习!
每个概念都解释!每行代码都说明白!
预计时间:2-3 小时(含费曼输出练习)
📖 第 1 步:快速复习前几天的内容(20 分钟)
费曼输出 #0:考考你
合上教程,尝试回答:
□ 什么是监督学习?用自己的话解释,不要用"有标签数据"这种术语
□ SVM 的核心思想是什么?用至少 2 个生活例子说明
□ 支持向量有什么特点?为什么重要?
□ 如果让你向朋友解释核技巧,你会怎么说?
⏰ 时间:15 分钟
如果都能答出来,我们开始今天的内容!如果有忘记的,花 5 分钟翻一下 Day04。
🔮 第 2 步:什么是无监督学习?(30 分钟)
故事时间 📚
想象你在整理书架上的书:
情况 1:监督学习(有人告诉你怎么分)
妈妈告诉你:
- 这些是小说,放一层
- 这些是科普,放一层
- 这些是历史,放一层
你照做就好了 → 监督学习 ✅
情况 2:无监督学习(没人告诉你,自己发现规律)
给你一堆书,什么都不说:
你自己观察:
- 咦?这些书都有故事情节 → 可能是小说
- 那些书都是讲科学的 → 可能是科普
- 还有一些讲古代的事 → 可能是历史
你自己发现了分类规律 → 无监督学习 ✅
核心区别
监督学习 = 有老师教
✓ 给数据 + 给答案
✓ 就像考试有标准答案
✓ 我们学过的:KNN、决策树、SVM
无监督学习 = 自学
✓ 只给数据 + 没答案
✓ 就像自由探索,自己发现规律
✓ 今天要学的:K-means 聚类
🎯 费曼输出 #1:解释无监督学习
任务 1:向小学生解释
场景: 有个小朋友问你:"什么是无监督学习呀?"
要求:
- 不用"聚类"、"无标签"、"模式发现"这些专业术语
- 用游戏、学校、家庭等生活场景比喻
- 让小学生能听懂
参考模板:
"无监督学习就像______一样。
比如你有一堆积木,
没有人告诉你怎么分,
但是你自己发现______,
于是你把______放在一起,
把______放在一起。
这就是无监督学习!"
⏰ 时间:15 分钟
💡 卡壳检查点
如果你在解释时卡住了:
□ 我说不清楚监督学习和无监督学习的本质区别
□ 我不知道如何解释"没有答案也能学习"
□ 我只能背诵定义,不能用生活中的例子
这很正常! 标记下来,回去再看上面的内容,然后重新尝试解释!
提示:
- 监督学习 = 老师教你做题
- 无监督学习 = 你自己玩着玩着就学会了
🎯 第 3 步:K-means 聚类的工作原理(50 分钟)
核心思想:物以类聚
生活中的例子:
想象你在组织班级合影排队:
第 1 步:随便选 3 个位置站
● ● ●
(1 班) (2 班) (3 班)
第 2 步:同学们站到最近的中心点
矮个子 中等个 高个子
●●●● ●●●● ●●●●
第 3 步:调整中心点(移到平均位置)
● ● ●
●●●● ●●●● ●●●●
第 4 步:重复 2-3 步,直到稳定
不再变化了,就排好了!✅
K-means 的详细步骤
算法流程:
1. 选择 K 值(要分成几类)
→ 比如 K=3,就是分成 3 类
2. 随机初始化 K 个中心点
→ 随便选 3 个位置
3. 分配样本到最近的中心点
→ 每个点找离自己最近的老大
4. 更新中心点(移到平均值位置)
→ 老大移到小弟们的中心位置
5. 重复 3-4 步,直到不再变化
→ 收敛完成!✅
关键概念解释
K 值:
→ 要分成的类别数
→ 需要提前指定
→ 怎么选?后面会讲(肘部法则)
质心(Cluster Center):
→ 每个类的中心点
→ 所有点的平均位置
→ 就像"老大"的位置
距离:
→ 通常用直线距离(欧氏距离)
→ 越近越相似
→ 就像物理上的距离
🎯 费曼输出 #2:深入理解 K-means
任务 1:创造多个比喻
场景: 向不同背景的人解释 K-means
对小朋友:
用"分糖果"、"排队伍"等例子
对非技术人员:
用"分小组"、"归类整理"等例子
要求: 每个场景至少创造一个比喻
任务 2:解释为什么要迭代
思考题:
1. 为什么不能一次就分好,要反复迭代?
2. 每次迭代在做什么?
3. 什么时候停止迭代?
⏰ 时间:20 分钟
💡 卡壳检查点
□ 我解释不清迭代的目的
□ 我说不明白为什么中心点会移动
□ 我不能用生活中的例子说明
提示:
- 迭代 = 逐步改进
- 就像调音,越调越准
- 第一次分得不好,慢慢调整就好
💻 第 4 步:动手实现 K-means(60 分钟)
第 1 步:准备环境
在命令行输入:
pip install scikit-learn matplotlib
第 2 步:第一个 K-means 模型
打开 Jupyter Notebook,新建笔记本,输入:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np
print("=" * 50)
print("🔮 K-means 聚类初体验!")
print("=" * 50)
# 1. 创建数据集(模拟真实数据)
X, y_true = make_blobs(
n_samples=300, # 300 个样本
centers=4, # 4 个中心(真实的类别数)
n_features=2, # 2 个特征(方便画图)
cluster_std=0.8, # 每个类的分散程度
random_state=42
)
print(f"\n数据集信息:")
print(f"样本数:{len(X)}")
print(f"特征数:{X.shape[1]}")
print(f"真实类别数:{len(np.unique(y_true))}")
# 2. 可视化原始数据(假装我们不知道标签)
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], alpha=0.6, s=50)
plt.xlabel('特征 1')
plt.ylabel('特征 2')
plt.title('原始数据(没有标签)')
plt.grid(True, alpha=0.3)
plt.show()
# 3. 创建 K-means 模型(假设我们知道 K=4)
kmeans = KMeans(
n_clusters=4, # 分成 4 类
init='k-means++', # 智能初始化(更快收敛)
n_init=10, # 运行 10 次,选最好的
max_iter=300, # 最多迭代 300 次
random_state=42
)
# 4. 训练模型(拟合数据)
print("\n正在训练 K-means...")
kmeans.fit(X)
print("✅ 训练完成!")
# 5. 获取聚类结果
labels = kmeans.labels_ # 每个样本的类别
centers = kmeans.cluster_centers_ # 聚类中心
print(f"\n聚类结果:")
print(f"找到 {len(np.unique(labels))} 个类别")
print(f"聚类中心坐标:\n{centers}")
# 6. 可视化聚类结果
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
# 左图:真实标签
ax1.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis',
alpha=0.6, s=50, edgecolors='k')
ax1.set_title('真实类别(上帝视角)', fontsize=12)
ax1.set_xlabel('特征 1')
ax1.set_ylabel('特征 2')
ax1.grid(True, alpha=0.3)
# 右图:K-means 预测
ax2.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis',
alpha=0.6, s=50, edgecolors='k')
ax2.scatter(centers[:, 0], centers[:, 1], c='red',
s=200, marker='*', label='聚类中心')
ax2.set_title('K-means 聚类结果', fontsize=12)
ax2.set_xlabel('特征 1')
ax2.set_ylabel('特征 2')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
print("\n" + "=" * 50)
print("🎊 恭喜!你学会了 K-means 聚类!")
print("=" * 50)
按 Shift + Enter 运行!
🎯 费曼输出 #3:解释代码含义
逐行解释给小白听
任务: 假装你在教一个完全不懂编程的人
要解释清楚:
1. KMeans(n_clusters=4) 是在做什么?
2. init='k-means++' 是什么意思?为什么不用随机的?
3. n_init=10 和 max_iter=300 分别代表什么?
4. labels_ 和 cluster_centers_ 有什么区别?
5. 为什么说这是"无监督"学习?
要求:
- 不用"聚类"、"质心"、"迭代"等术语
- 用生活化的比喻
- 每行代码都要说明白
参考思路:
"KMeans(n_clusters=4) 就像是______"
"k-means++ 就像是______"
"n_init=10 就像是______,max_iter=300 就像是______"
"labels_ 就像是______,cluster_centers_ 就像是______"
⏰ 时间:25 分钟
💡 卡壳检查点
□ 我解释不清 k-means++ 的优势
□ 我分不清 n_init 和 max_iter 的区别
□ 我说不明白为什么需要多次运行
□ 我不知道 labels 是怎么来的
提示:
n_clusters= 要分几组(比如 4 组)k-means++= 聪明地选起点(不是瞎选)n_init= 跑 10 次,选最好的(避免运气不好)max_iter= 最多调整 300 次(防止没完没了)labels_= 每个人的分组编号cluster_centers_= 每组的中心位置
🎯 第 5 步:如何选择 K 值?(40 分钟)
问题:K 值应该设多少?
核心方法:肘部法则
就像买衣服选尺码:
太小 → 不舒服
太大 → 不好看
适中 → 刚刚好
肘部法则的原理
print("=" * 50)
print("🔧 实验:肘部法则选 K 值")
print("=" * 50)
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
# 使用之前的数据 X
# 尝试不同的 K 值(从 1 到 10)
inertias = [] # 存储每个 K 值的误差
for k in range(1, 11):
kmeans_k = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans_k.fit(X)
# 获取惯性(误差的度量)
inertia = kmeans_k.inertia_
inertias.append(inertia)
print(f"K={k:2d} → 惯性(误差): {inertia:.2f}")
# 画肘部图
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), inertias, 'bo-', linewidth=2, markersize=8)
plt.xlabel('K 值(类别数)', fontsize=12)
plt.ylabel('惯性(误差)', fontsize=12)
plt.title('肘部法则 - 选择最佳 K 值', fontsize=14)
plt.grid(True, alpha=0.3)
# 标记"肘部"位置
plt.annotate('肘部 →', xy=(4, inertias[3]),
xytext=(5, inertias[3] + 100),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=12, color='red')
plt.show()
print("\n结论:")
print("✓ K 太小 → 误差大(分得太粗)")
print("✓ K 太大 → 误差小但过拟合(分得太细)")
print("✓ 最佳 K = 肘部位置(拐点)")
print("✓ 如图中的 K=4")
为什么叫"肘部"?
看这个图的形状:
惯性
│
│ ●
│ ●
│ ● ← 这里像胳膊肘!
│ ●
│ ●
│ ●
└───────────── K
在"肘部"位置,下降速度明显变缓
就像胳膊弯曲的地方 → 所以叫"肘部法则"
🎯 费曼输出 #4:深入理解肘部法则
任务 1:用故事解释 K 值选择
场景: 给小朋友讲一个选餐厅的故事
故事框架:
你要选一个餐厅请客:
K=1 → 只去一家最大的
所有人都挤在一起,体验很差 ❌
K=2 → 选两家
还是有点挤,但好一些了
K=3 → 选三家
开始合理了,大家都能坐舒服
K=4 → 选四家 ← 刚刚好!✅
每家店都不挤,也不会太远
K=10 → 选十家
每家店只有几个人,但跑断腿 ❌
所以 K=4 是最好的!
任务 2:解释惯性的含义
思考题:
1. 惯性(inertia)是什么?
2. 为什么 K 越大,惯性越小?
3. 既然 K 越大越好,为什么不选 K=100?
⏰ 时间:20 分钟
💡 卡壳检查点
□ 我解释不清惯性的物理意义
□ 我说不明白为什么要有 trade-off
□ 我不能用生活中的例子说明
提示:
- 惯性 = 组内差异的总和
- K 越大 = 每组越小 = 差异越小
- 但 K 太大 = 过度细分 = 失去意义
🎨 第 6 步:实战项目:客户分群(50 分钟)
背景介绍
你是电商公司的数据分析师
老板给你一堆客户数据:
- 年龄、收入
- 消费金额、消费频率
- 浏览时长、点击次数
目标:把客户分成几类
→ 了解不同类型的客户
→ 制定针对性的营销策略
完整项目代码
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
print("=" * 50)
print("🛒 客户分群实战项目")
print("=" * 50)
# 1. 创建模拟数据
print("\n正在创建客户数据...")
np.random.seed(42)
n_customers = 500
# 创建 4 种不同类型的客户
# 类型 1:高价值客户(有钱、爱买)
high_value = pd.DataFrame({
'age': np.random.normal(35, 8, 100),
'income': np.random.normal(80000, 15000, 100),
'spending_score': np.random.normal(80, 10, 100),
'visit_frequency': np.random.normal(20, 5, 100)
})
# 类型 2:年轻冲动型(年轻、钱不多但爱买)
young_impulsive = pd.DataFrame({
'age': np.random.normal(22, 3, 150),
'income': np.random.normal(25000, 8000, 150),
'spending_score': np.random.normal(70, 15, 150),
'visit_frequency': np.random.normal(25, 8, 150)
})
# 类型 3:理性消费型(中年、收入稳定、谨慎消费)
rational = pd.DataFrame({
'age': np.random.normal(45, 10, 150),
'income': np.random.normal(60000, 12000, 150),
'spending_score': np.random.normal(40, 10, 150),
'visit_frequency': np.random.normal(8, 3, 150)
})
# 类型 4:低活跃型(年纪大、不常来)
low_active = pd.DataFrame({
'age': np.random.normal(55, 12, 100),
'income': np.random.normal(40000, 15000, 100),
'spending_score': np.random.normal(20, 8, 100),
'visit_frequency': np.random.normal(3, 2, 100)
})
# 合并数据
data = pd.concat([high_value, young_impulsive, rational, low_active], ignore_index=True)
data.columns = ['Age', 'Income', 'SpendingScore', 'VisitFrequency']
print(f"✓ 数据创建完成!")
print(f"客户总数:{len(data)} 人")
print(f"特征数量:{data.shape[1]} 个")
# 2. 数据标准化(很重要!)
print("\n正在标准化数据...")
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
print("✓ 标准化完成!")
print("为什么要标准化?")
print("→ 避免数值大的特征主导(如收入 vs 访问次数)")
# 3. 用肘部法则选 K 值
print("\n正在寻找最佳 K 值...")
inertias = []
K_range = range(1, 11)
for k in K_range:
kmeans_temp = KMeans(n_clusters=k, random_state=42, n_init=10)
kmeans_temp.fit(data_scaled)
inertias.append(kmeans_temp.inertia_)
# 画肘部图
plt.figure(figsize=(10, 6))
plt.plot(K_range, inertias, 'bo-', linewidth=2, markersize=8)
plt.xlabel('K 值', fontsize=12)
plt.ylabel('惯性(误差)', fontsize=12)
plt.title('肘部法则 - 选择最佳 K 值', fontsize=14)
plt.grid(True, alpha=0.3)
plt.xticks(K_range)
plt.show()
# 从图中可以看出 K=4 是肘部
optimal_k = 4
print(f"\n根据肘部法则,最佳 K 值 = {optimal_k}")
# 4. 训练最终模型
print(f"\n正在训练 K-means 模型(K={optimal_k})...")
kmeans_final = KMeans(
n_clusters=optimal_k,
init='k-means++',
n_init=10,
max_iter=300,
random_state=42
)
data['Cluster'] = kmeans_final.fit_predict(data_scaled)
print("✅ 模型训练完成!")
# 5. 分析每个群体的特征
print("\n" + "=" * 50)
print("📊 各群体特征分析")
print("=" * 50)
cluster_summary = data.groupby('Cluster').mean()
print(cluster_summary.round(2))
# 6. 可视化聚类结果
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
# 图 1:年龄 vs 收入
scatter1 = axes[0, 0].scatter(data['Age'], data['Income'],
c=data['Cluster'], cmap='viridis',
alpha=0.6, s=50)
axes[0, 0].set_title('年龄 vs 收入', fontsize=12)
axes[0, 0].set_xlabel('年龄')
axes[0, 0].set_ylabel('年收入(元)')
plt.colorbar(scatter1, ax=axes[0, 0])
# 图 2:收入 vs 消费评分
scatter2 = axes[0, 1].scatter(data['Income'], data['SpendingScore'],
c=data['Cluster'], cmap='viridis',
alpha=0.6, s=50)
axes[0, 1].set_title('收入 vs 消费评分', fontsize=12)
axes[0, 1].set_xlabel('年收入(元)')
axes[0, 1].set_ylabel('消费评分')
plt.colorbar(scatter2, ax=axes[0, 1])
# 图 3:访问频率 vs 消费评分
scatter3 = axes[1, 0].scatter(data['VisitFrequency'], data['SpendingScore'],
c=data['Cluster'], cmap='viridis',
alpha=0.6, s=50)
axes[1, 0].set_title('访问频率 vs 消费评分', fontsize=12)
axes[1, 0].set_xlabel('年访问次数')
axes[1, 0].set_ylabel('消费评分')
plt.colorbar(scatter3, ax=axes[1, 0])
# 图 4:各群体人数分布
cluster_counts = data['Cluster'].value_counts().sort_index()
axes[1, 1].bar(cluster_counts.index, cluster_counts.values,
color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#FFA07A'])
axes[1, 1].set_title('各群体人数分布', fontsize=12)
axes[1, 1].set_xlabel('群体编号')
axes[1, 1].set_ylabel('人数')
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 7. 给出营销建议
print("\n" + "=" * 50)
print("💡 营销策略建议")
print("=" * 50)
for i in range(optimal_k):
cluster_data = data[data['Cluster'] == i]
avg_age = cluster_data['Age'].mean()
avg_income = cluster_data['Income'].mean()
avg_spending = cluster_data['SpendingScore'].mean()
avg_visits = cluster_data['VisitFrequency'].mean()
print(f"\n群体 {i}:")
print(f" 平均年龄:{avg_age:.1f} 岁")
print(f" 平均收入:{avg_income:.0f} 元")
print(f" 平均消费评分:{avg_spending:.1f}")
print(f" 平均访问次数:{avg_visits:.1f} 次/年")
# 根据特征给出建议
if avg_income > 60000 and avg_spending > 60:
print(f" 💰 策略:VIP 服务,高端产品推荐")
elif avg_age < 30 and avg_spending > 50:
print(f" 🎯 策略:社交媒体营销,限时折扣")
elif avg_visits < 10:
print(f" 📢 策略:唤醒活动,发送优惠券")
else:
print(f" 📊 策略:保持关注,适度促销")
print("\n" + "=" * 50)
print("🎊 恭喜!你完成了客户分群项目!")
print("=" * 50)
🎯 费曼输出 #5:完整项目讲解
任务:当一次数据分析师
场景: 你要向老板汇报客户分群的成果
要覆盖的内容:
1. 项目背景和目标
2. 数据来源和特征
3. 为什么需要标准化?
4. 如何选择 K 值?
5. 发现了哪些客户群体?
6. 每个群体的特点是什么?
7. 针对性的营销建议
方式:
- 📊 做一个 10 分钟的汇报 PPT
- 🎤 录一段讲解视频
- 👥 找个朋友,完整地讲给他听
⏰ 时间:30 分钟
🎉 今日费曼总结(30 分钟)⭐
完整的费曼学习流程
第 1 步:回顾今天的内容(5 分钟)
□ 无监督学习 vs 监督学习
□ K-means 的工作原理
□ 肘部法则选 K 值
□ 客户分群实战项目
第 2 步:合上教程,尝试完整教授(15 分钟)⭐
任务: 假装你在给一个完全不懂的人上第五堂课
要覆盖:
- 无监督学习的核心思想(至少 2 个比喻)
- K-means 的工作流程(用生活例子)
- 为什么要用肘部法则?
- 客户分群项目的完整流程
方式:
- 📝 写一篇 800 字左右的文章
- 🎤 录一段 10-15 分钟的视频
- 👥 找个朋友,给他讲一遍
第 3 步:标记卡壳点(5 分钟)
我今天卡壳的地方:
□ _________________________________
□ _________________________________
□ _________________________________
第 4 步:针对性复习(5 分钟)
回到教程中卡壳的地方,重新学习,然后再次尝试解释!
📝 费曼学习笔记模板
╔═══════════════════════════════════════════════════╗
║ Day 5 费曼学习笔记 ║
╠═══════════════════════════════════════════════════╣
║ 日期:__________ ║
║ 学习时长:__________ ║
╠═══════════════════════════════════════════════════╣
║ ║
║ 1. 我向小白解释了: ║
║ _______________________________________________ ║
║ _______________________________________________ ║
║ ║
║ 2. 我卡壳的地方: ║
║ □ _____________________________________________ ║
║ □ _____________________________________________ ║
║ ║
║ 3. 我的通俗比喻: ║
║ • 无监督学习就像 ______ ║
║ • K-means 就像 ______ ║
║ • 肘部法则就像 ______ ║
║ ║
║ 4. 我还想知道: ║
║ _______________________________________________ ║
║ ║
╚═══════════════════════════════════════════════════╝
📊 今日总结
✅ 你今天学到了:
1. 无监督学习
- 没有答案也能学习
- 自己发现数据规律
- 物以类聚的思想
2. K-means 聚类
- 迭代优化的过程
- 分配→更新→再分配
- 直到收敛
3. 肘部法则
- 选择合适的 K 值
- 平衡过拟合和欠拟合
- 找到"拐点"
4. 完整项目
- 客户分群实战
- 数据标准化
- 特征分析和营销策略
5. 费曼输出能力 ⭐
- 能用比喻解释无监督学习
- 能向小白说明 K-means
- 能完整讲解项目
🎁 明日预告
明天你将学习:
主题:模型评估和优化
内容:
✓ 准确率、精确率、召回率
✓ 过拟合和欠拟合
✓ 交叉验证
✓ 正则化技术
需要准备:
✓ 复习今天的 K-means
✓ 了解什么是"评估指标"
✓ 保持好奇心!
🆘 常见问题
Q1: K-means 适合什么情况?
适合:
✓ 数据量较大
✓ 特征都是数值型
✓ 类别比较明显
✓ 需要简单快速的方法
不适合:
✗ 类别形状不规则
✗ 有噪声或异常值
✗ 类别大小差异很大
Q2: 如何处理 categorical 特征?
方法 1:独热编码(One-Hot Encoding)
male/female → [1,0] / [0,1]
方法 2:标签编码(Label Encoding)
male/female → 0/1
方法 3:用其他聚类算法
如 K-modes(专门处理类别型)
💪 最后的鼓励
第五天完成了! 🎉
你已经学会了:
✓ K 近邻(Day 2)
✓ 决策树和随机森林(Day 3)
✓ SVM(Day 4)
✓ K-means 聚类(Day 5)
四种强大的算法!
你现在已经掌握了机器学习的核心技能!
更重要的是:
✓ 你能用自己的话解释抽象概念了
✓ 你能创造生动的比喻了
✓ 你能发现并解决知识盲点了
✓ 你能对比不同算法了
继续加油!明天学习模型评估!💪
记住费曼的话:
"如果你不能简单地解释它,你就没有真正理解它"
今天你能用自己的话解释 K-means 和无监督学习了吗?
如果能,你就真的学会了!
加油!我相信你一定可以的!✨
📞 打卡模板
日期:___________
学习时长:_______ 小时
费曼输出次数:_______ 次
今天学会了:
遇到的卡壳点:
如何用比喻解释的:
明天的目标:
明天见!继续加油! ✨
🔗 相关链接
🌐 项目资源
- 💻 GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge
- 📖 CSDN 专栏: https://blog.csdn.net/m0_67081842?type=blog
- ⭐ 如果觉得有帮助,请给 GitHub 仓库 Star 支持!
本教程属于 AI 入门 30 天挑战 系列
💬 互动时间
思考题:今天的知识点中,哪个让你印象最深刻?为什么?
欢迎在评论区分享你的想法或疑问!👇
❤️ 如果有帮助
- 👍 点赞:让更多人看到这篇教程
- ⭐ Star GitHub:获取完整代码和项目
- ➕ 关注专栏:不错过后续更新
- 🔄 分享给朋友:一起学习进步
明天见!继续 Day 6 的学习~ 🚀
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)