商务智能与数据分析 教案 第五章实验 K-Means 算法原理与 K 值选择(手肘法)_第1页
商务智能与数据分析 教案 第五章实验 K-Means 算法原理与 K 值选择(手肘法)_第2页
商务智能与数据分析 教案 第五章实验 K-Means 算法原理与 K 值选择(手肘法)_第3页
商务智能与数据分析 教案 第五章实验 K-Means 算法原理与 K 值选择(手肘法)_第4页
商务智能与数据分析 教案 第五章实验 K-Means 算法原理与 K 值选择(手肘法)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验5-1:K-Means算法原理与K值选择(手肘法)1.实验描述K-Means是最常用的聚类算法。本实验使用计算机生成的简单“团状”数据,模拟不同分布的样本。我们将直观地观察质心(Centroids)是如何移动的,并学习解决K-Means最头疼的问题:“到底分几类最合适?”(学习使用手肘法)。2.实验目的理解K-Means的迭代过程(计算质心->分配样本->更新质心)。掌握KMeans类的调用及cluster_centers_属性的含义。核心目标:掌握“手肘法(ElbowMethod)”,通过SSE(误差平方和)确定最佳的K值。3.实验步骤与代码Pythonimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromsklearn.datasetsimportmake_blobs#步骤1:生成模拟数据(4个明显的中心)#n_samples=300,centers=4,cluster_std=0.60X,y=make_blobs(n_samples=300,centers=4,cluster_std=0.60,random_state=0)plt.figure(figsize=(8,5))plt.scatter(X[:,0],X[:,1],s=50)plt.title("原始未标记数据")plt.show()#步骤2:尝试K=4进行聚类kmeans=KMeans(n_clusters=4,random_state=0)y_kmeans=kmeans.fit_predict(X)#可视化聚类结果与质心plt.figure(figsize=(8,5))#画样本点plt.scatter(X[:,0],X[:,1],c=y_kmeans,s=50,cmap='viridis')#画质心(红色大点)centers=kmeans.cluster_centers_plt.scatter(centers[:,0],centers[:,1],c='red',s=200,alpha=0.7,marker='X',label='质心')plt.title("K-Means聚类结果(K=4)")plt.legend()plt.show()#步骤3:寻找最佳K值(手肘法)sse=[]#误差平方和(SumofSquaredErrors)k_range=range(1,10)forkink_range:km=KMeans(n_clusters=k,random_state=0)km.fit(X)sse.append(km.inertia_)#inertia_就是SSE#绘制手肘图plt.figure(figsize=(8,5))plt.plot(k_range,sse,marker='o')plt.xlabel('K值(聚类数量)')plt.ylabel('SSE(误差平方和)')plt.title('手肘法寻找最佳K值')plt.annotate('肘部(最佳点)',xy=(4,sse[3]),xytext=(5,1000),arrowprops=dict(facecolor='black',shrink=0.05))plt.show()4.实验总结可视化:通过红色“X”标记,我们能清晰看到算法找到的中心点。手肘法:随着K增加,SSE会一直下降。但在K=4时,下降速度突然变缓(出现拐点/肘部),说明K=4是性价比最高的分类数量。

实验5-2:层次聚类与树状图(Dendrogram)1.实验描述层次聚类不需要预先指定K值,而是生成一个层级结构。本实验通过绘制“树状图”,让我们看到数据是如何一步步从“各自为战”合并成“一个大家族”的。这在分析分类层级关系(如生物分类、商品品类归属)时非常有用。2.实验目的理解层次聚类(凝聚型)的“自底向上”合并过程。学会使用scipy.cluster.hierarchy绘制树状图(Dendrogram)。学会根据树状图的高度(距离)来决定在哪里“剪断”,从而确定聚类数量。3.实验步骤与代码Pythonimportscipy.cluster.hierarchyasschfromsklearn.clusterimportAgglomerativeClustering#使用与上一个实验相同的数据X(只取前20个点以便观察树图细节)X_subset=X[:20]#步骤1:绘制树状图plt.figure(figsize=(10,7))plt.title("层次聚类树状图(Dendrogram)")plt.xlabel("样本索引")plt.ylabel("欧氏距离(合并阈值)")#method='ward'表示最小化簇内方差dendrogram=sch.dendrogram(sch.linkage(X_subset,method='ward'))plt.show()#步骤2:使用AgglomerativeClustering进行聚类#假设我们根据树图决定分4类hc=AgglomerativeClustering(n_clusters=4,affinity='euclidean',linkage='ward')y_hc=hc.fit_predict(X)print(f"前10个样本的聚类标签:{y_hc[:10]}")4.实验总结树状图的纵轴代表距离。垂直线越长,说明这两个(组)簇之间的差异越大。这种方法特别适合不需要明确K值,或者希望探索数据内部层级结构的场景。

实验5-3:K-Means的局限与DBSCAN密度聚类1.实验描述K-Means假设簇是凸形(球状)的,但在处理复杂形状(如月牙形、环形)时往往失效。DBSCAN基于密度,能发现任意形状的簇,还能识别噪声。本实验通过对比,展示不同算法的适用边界。2.实验目的验证K-Means在非球形数据上的失败。掌握DBSCAN算法的核心参数eps(邻域半径)和min_samples(最小样本数)。理解DBSCAN如何识别噪声点(Outliers)。3.实验步骤与代码Pythonfromsklearn.datasetsimportmake_moonsfromsklearn.clusterimportDBSCAN#步骤1:生成“双月形”非凸数据X_moon,_=make_moons(n_samples=300,noise=0.05,random_state=0)#步骤2:使用K-Means尝试聚类(预期失败)kmeans=KMeans(n_clusters=2,random_state=0)y_km=kmeans.fit_predict(X_moon)#步骤3:使用DBSCAN尝试聚类(预期成功)dbscan=DBSCAN(eps=0.3,min_samples=5)y_db=dbscan.fit_predict(X_moon)#步骤4:对比可视化fig,(ax1,ax2)=plt.subplots(1,2,figsize=(14,5))#K-Means结果ax1.scatter(X_moon[:,0],X_moon[:,1],c=y_km,cmap='viridis',s=50)ax1.set_title("K-Means聚类结果(失败)")#DBSCAN结果#噪声点标签为-1,显示为紫色或特殊颜色ax2.scatter(X_moon[:,0],X_moon[:,1],c=y_db,cmap='viridis',s=50)ax2.set_title("DBSCAN聚类结果(成功)")plt.show()4.实验总结K-Means强行用直线划分双月,导致分类错误。DBSCAN顺着数据的密度“爬行”,完美分离了两个月牙形状,证明了其在特定几何结构下的优越性。

实验5-4:【综合实验】商场客户细分与画像构建1.实验描述模拟一个购物中心的会员数据,包含“年收入”和“消费评分(1-100)”。我们需要扮演数据分析师,利用聚类算法将客户分为不同的群体(如“高富帅”、“潜力股”、“节俭党”等),并针对每一类客户提出营销建议。2.实验目的综合运用数据预处理、K-Means建模和可视化。核心目标:学会解释聚类结果。聚类只是手段,给每一类人打上业务标签(UserProfiling)才是目的。3.实验步骤与代码Pythonimportpandasaspdimportseabornassns#步骤1:构建模拟商务数据#模拟200个客户#特征:客户ID,性别,年龄,年收入(k$),消费评分(1-100)np.random.seed(42)data={'AnnualIncome(k$)':np.random.randint(15,130,200),'SpendingScore(1-100)':np.random.randint(1,100,200)}#人为制造一些明显的群组逻辑以便于教学演示#组1:低收入,低消费#组2:低收入,高消费#组3:高收入,低消费#组4:高收入,高消费#组5:中等收入,中等消费(大多数人)#(此处为了简化代码,直接使用随机数据,实际教学可用真实Mall_Customers数据集)df=pd.DataFrame(data)#取出用于聚类的特征X=df.values#步骤2:确定最佳K值(再次练习手肘法)wcss=[]foriinrange(1,11):kmeans=KMeans(n_clusters=i,init='k-means++',random_state=42)kmeans.fit(X)wcss.append(kmeans.inertia_)plt.plot(range(1,11),wcss)plt.title('手肘法')plt.xlabel('K值')plt.ylabel('WCSS')plt.show()#假设手肘图显示K=5最合适#步骤3:训练模型(K=5)kmeans=KMeans(n_clusters=5,init='k-means++',random_state=42)y_kmeans=kmeans.fit_predict(X)#将聚类结果添加入原始数据df['Cluster']=y_kmeans#步骤4:结果可视化与业务解读plt.figure(figsize=(10,6))sns.scatterplot(x='AnnualIncome(k$)',y='SpendingScore(1-100)',hue='Cluster',data=df,palette='deep',s=100)plt.title('客户细分群体(CustomerSegments)')plt.xlabel('年收入(k$)')plt.ylabel('消费评分(1-100)')plt.legend(title='群体ID')plt.show()#步骤5:打印各群体的统计特征print("---各群体特征均值---")print(df.groupby('Cluster').mean())4.实验总结与业务思考请根据上述散点图和统计表,尝试为5个群体命名并制定策略:群体A(高收入,高分):VIP客户。策略:推荐高端奢侈品,提供专属服务。群体B(低收入,高分):月光族/年轻狂热者。策略:促销折扣,分期付款服务。群体C(高收入,低分):理智

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论