汽车产品聚类分析实验

举报
bit_zhy 发表于 2023/06/29 13:46:21 2023/06/29
【摘要】 机器学习实验-汽车产品聚类分析

汽车产品聚类分析

 

1        实验简介

本实验以竞品分析为背景,通过数据的聚类,为汽车提供聚类分类。对于指定的车型,可以通过聚类分析找到其竞品车型。通过这个实验,鼓励学生利用车型数据,进行车型画像的分析,为产品的定位,竞品分析提供数据决策。

2        实验目的

  • 掌握三种聚类方法,包括至少一种深度聚类方法
  • 完成对实验数据的聚类分析

3        相关理论与知识点

方法一:K-Means聚类算法

K-Means聚类算法是常用的无监督学习算法,其思想是将n个数据点分成k个簇,使得簇内的数据点相似度较高,簇间的数据点相似度较低。在汽车产品聚类分析中,我们可以利用K-Means算法将具有相似车型、价格、品牌、排量等特征的汽车产品聚类在一起。

通过计算数据之间的距离将它们分配到预定数量的簇中,使得簇内数据的差异最小化,而簇间数据的差异最大化。在这个方法中,我们需要选择一个合适的k值(簇的数量),并且通过迭代的方式来最小化数据的总距离。

具体实现过程如下:

1.选择合适的k值(簇的数量);

2.随机初始化k个聚类中心;

3.对于每个数据点,计算它与每个聚类中心之间的距离,并将数据点分配到距离最近的聚类中心所代表的簇中;

4.计算每个簇的中心,并将它作为新的聚类中心;

5.重复步骤34,直到聚类中心不再变化或者达到了最大迭代次数。

方法二:层次聚类算法

层次聚类算法是将数据点逐步进行合并,形成一个层次结构,最终形成一个树状结构,从而将数据点聚类成不同的组。在汽车产品聚类分析中,我们可以利用层次聚类算法将具有相似车型、价格、品牌、排量等特征的汽车产品聚类在一起。

具体实现过程如下:

1.对数据进行预处理,去除无用字段并对缺失值进行填充。

2.对数据进行归一化处理,使各个特征维度具有相同的权重。

3.选择合适的距离度量方法,本例中采用欧氏距离。

4.进行层次聚类,直到簇的数量为3

方法三:DBSCAN聚类算法

DBSCAN是一种基于密度的聚类算法,它能够将密度相近的数据点聚集在一起形成簇。相对于K-Means和层次聚类,DBSCAN算法不需要指定簇的个数,而是通过设置距离阈值和密度阈值来判断数据点是否属于同一簇。

具体实现过程如下:

1.数据预处理:对数据进行标准化或归一化处理,使各个维度的特征权重一致。

2.参数设置:DBSCAN算法的主要参数有两个:ε(eps)和minPts。其中,ε表示领域的半径大小,minPts表示领域内最少的数据点个数。

3.计算点密度:对于每个数据点,计算其ε领域内的点数。

4.标记点类型:将每个点按照其ε领域内的点数与minPts进行比较,确定其为核心点、边界点或噪声点。

5.构建簇:对于每个核心点,以其为中心,将其ε领域内的所有点添加到同一个簇中。

6.迭代聚类:对于所有未被标记为核心点或边界点的数据点,将其标记为噪声点或分配到合适的簇中。

 

4        实验任务及评分标准

序号

任务名称

任务具体要求

评分标准(100分制)

1

采用至少三种聚类方法分析

运用聚类算法,对该汽车数据进行聚类分析,并找到vokswagen汽车的相应竞品。聚类个数学生可以根据数据集的特点自己指定,但需说明聚类的依据。

使用Mindspore框架,采用Jupyter写代码。

开发语言:Python

每种算法对应一个独立的代码文件(.ipynb)。

至少三种聚类算法可以写到一个实验报告中。

Jupyter代码提交到华为云平台;

同时将提交到将源代码、实验报告打包成一个文件上传到乐学网站中,压缩包命名:学号+姓名+汽车产品聚类

 

5        实验条件与环境

 

要求

名称

版本要求

备注

编程语言

Python

 

 

开发环境

Jupyter

 

 

第三方工具包//插件

Mindspore

 

 

 

6        实验数据及其说明

属性(条目)

内容

数据集的名称

汽车产品聚类分析数据集

数据集的出处

汽车产品

数据集的主要内容

汽车产品聚类分析数据集通常包含一系列汽车产品的相关信息,这些信息可以用来进行聚类分析以确定不同汽车产品之间的相似性和差异性。

以下是可能包含在汽车产品聚类分析数据集中的主要内容:

汽车产品的属性、汽车产品的尺寸和重量、汽车产品的燃油经济性、汽车产品的安全性能、汽车产品的舒适性和便利性。

这些信息可以帮助进行聚类分析,以找到相似的汽车产品群组,可以用于市场分析、产品定位和推销策略等。

 

数据集的文件格式

car_price.csv,数据包括了205款车的26个字段

 

7        实验步骤及其代码

步骤序号

1

步骤名称

读取、观察数据

步骤描述

 

代码及讲解

import pandas as pd

 

car_price=pd.read_csv('car_price.csv')

car_price.head()

car_price.duplicated().sum()

car_price.info()

输出结果及其解读

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 205 entries, 0 to 204

Data columns (total 26 columns):

 #   Column            Non-Null Count  Dtype 

---  ------            --------------  ----- 

 0   car_ID            205 non-null    int64 

 1   symboling         205 non-null    int64 

 2   CarName           205 non-null    object

 3   fueltype          205 non-null    object

 4   aspiration        205 non-null    object

 5   doornumber        205 non-null    object

 6   carbody           205 non-null    object

 7   drivewheel        205 non-null    object

 8   enginelocation    205 non-null    object

 9   wheelbase         205 non-null    float64

 10  carlength         205 non-null    float64

 11  carwidth          205 non-null    float64

 12  carheight         205 non-null    float64

 13  curbweight        205 non-null    int64 

 14  enginetype        205 non-null    object

 15  cylindernumber    205 non-null    object

 16  enginesize        205 non-null    int64 

 17  fuelsystem        205 non-null    object

 18  boreratio         205 non-null    float64

 19  stroke            205 non-null    float64

 20  compressionratio  205 non-null    float64

 21  horsepower        205 non-null    int64 

 22  peakrpm           205 non-null    int64 

 23  citympg           205 non-null    int64 

 24  highwaympg        205 non-null    int64 

 25  price             205 non-null    float64

dtypes: float64(8), int64(8), object(10)

memory usage: 41.8+ KB

 

步骤序号

2

步骤名称

观察每个类别的取值情况

步骤描述

 

代码及讲解

cate_columns=['symboling','fueltype','aspiration','doornumber','carbody','drivewheel','enginelocation','enginetype','fuelsystem','cylindernumber']

 

for i in cate_columns:

    print(i)

    print(set(car_price[i]))

输出结果及其解读

symboling

{0, 1, 2, 3, -2, -1}

fueltype

{'diesel', 'gas'}

aspiration

{'std', 'turbo'}

doornumber

{'four', 'two'}

carbody

{'convertible', 'hatchback', 'wagon', 'sedan', 'hardtop'}

drivewheel

{'rwd', 'fwd', '4wd'}

enginelocation

{'front', 'rear'}

enginetype

{'dohc', 'ohcv', 'l', 'dohcv', 'rotor', 'ohc', 'ohcf'}

fuelsystem

{'spdi', 'mfi', 'spfi', 'idi', 'mpfi', '1bbl', '4bbl', '2bbl'}

cylindernumber

{'eight', 'six', 'two', 'three', 'five', 'four', 'twelve'}

 

步骤序号

3

步骤名称

气缸数数值化并提取变量特征数据(除了'car_ID''CarName')

步骤描述

 

代码及讲解

car_price['cylindernumber']=car_price.cylindernumber.replace({'two':2,'three':3,'four':4,'five':5,'six':6,'eight':8,'twelve':12})

car_df=car_price.drop(['car_ID','CarName'],axis=1)

 

car_df.describe()

输出结果及其解读

 

 

步骤序号

4

步骤名称

拆出品牌信息

步骤描述

利用split,由CarName拆出品牌信息

代码及讲解

carBrand=car_price['CarName'].str.split(expand=True)[0]

print(set(carBrand))

输出结果及其解读

{'volkswagen', 'porcshce', 'saab', 'renault', 'subaru', 'isuzu', 'maxda', 'honda', 'Nissan', 'plymouth', 'audi', 'alfa-romero', 'dodge', 'vw', 'peugeot', 'volvo', 'chevrolet', 'buick', 'bmw', 'jaguar', 'mercury', 'toyota', 'porsche', 'toyouta', 'vokswagen', 'mitsubishi', 'nissan', 'mazda'}

 

步骤序号

5

步骤名称

修改品牌名称的不规则命名

步骤描述

 

代码及讲解

carBrand=carBrand.replace({'porcshce':'porsche','vokswagen':'volkswagen','Nissan':'nissan','maxda':'mazda','vw':'volkswagen','toyouta':'toyota'})

print(set(carBrand))

 

car_price['carBrand']=carBrand

输出结果及其解读

{'volkswagen', 'saab', 'renault', 'subaru', 'isuzu', 'honda', 'plymouth', 'audi', 'alfa-romero', 'dodge', 'peugeot', 'volvo', 'chevrolet', 'buick', 'bmw', 'jaguar', 'mercury', 'toyota', 'porsche', 'mitsubishi', 'nissan', 'mazda'}

 

步骤序号

6

步骤名称

依据车身长划分为6

步骤描述

 

代码及讲解

bins=[min(car_df.carlength)-0.01,145.67,169.29,181.10,192.91,200.79,max(car_df.carlength)+0.01]

label=['A00','A0','A','B','C','D']

carSize=pd.cut(car_df.carlength,bins,labels=label)

print(carSize)

 

car_price['carSize']=carSize

car_df['carSize']=carSize

输出结果及其解读

0      A0

1      A0

2       A

3       A

4       A

       ..

200     B

201     B

202     B

203     B

204     B

Name: carlength, Length: 205, dtype: category

Categories (6, object): ['A00' < 'A0' < 'A' < 'B' < 'C' < 'D']

 

步骤序号

7

步骤名称

剔除carlength

步骤描述

 

代码及讲解

features=car_df.drop(['carlength'],axis=1)

输出结果及其解读

 

 

步骤序号

8

步骤名称

类别变量编码

步骤描述

 

代码及讲解

from sklearn.preprocessing import LabelEncoder

 

features1=features.copy()

carSize1=LabelEncoder().fit_transform(features1['carSize'])

features1['carSize']=carSize1

 

cate=features1.select_dtypes(include='object').columns

print(cate)

 

features1=features1.join(pd.get_dummies(features1[cate])).drop(cate,axis=1)

features1.head()

输出结果及其解读

Index(['fueltype', 'aspiration', 'doornumber', 'carbody', 'drivewheel',

       'enginelocation', 'enginetype', 'fuelsystem'],

      dtype='object')

 

步骤序号

9

步骤名称

对数值型数据进行归一化

步骤描述

 

代码及讲解

from sklearn import preprocessing

 

features1=preprocessing.MinMaxScaler().fit_transform(features1)

features1=pd.DataFrame(features1)

features1.head()

输出结果及其解读

 

 

步骤序号

10

步骤名称

对数据集进行PCA降维

步骤描述

 

代码及讲解

from sklearn.decomposition import PCA

 

pca=PCA(n_components=8)

features2=pca.fit_transform(features1)

输出结果及其解读

 

 

步骤序号

11

步骤名称

导出为csv文件

步骤描述

 

代码及讲解

features2 = pd.DataFrame(features2)

features2.to_csv('csv.csv', sep=',', index=False, header=True)

输出结果及其解读

 

 

步骤序号

12

步骤名称

读取数据

步骤描述

 

代码及讲解

from pandas import read_csv

 

data = read_csv('csv.csv', header=0, index_col=None)

x = data.iloc[:, 2:].values

y = data.iloc[:, 1].values

输出结果及其解读

 

 

步骤序号

13

步骤名称

数据标准化

步骤描述

 

代码及讲解

from sklearn.preprocessing import StandardScaler

 

scaler = StandardScaler()

x_scaled = scaler.fit_transform(x)

输出结果及其解读

 

 

步骤序号

14

步骤名称

KMeans聚类

步骤描述

 

代码及讲解

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=5, random_state=0).fit(x_scaled)

centroids = kmeans.cluster_centers_

labels = kmeans.labels_

 

print(centroids)

print(labels)

输出结果及其解读

[[-0.58589626 -0.37460815 -0.55737669  0.18666357  0.21133472  0.43280211]

 [-0.61163855  1.26456235  1.44528704 -0.93102337 -0.2190535   0.98908825]

 [ 0.95037702 -1.15980248  1.49330234  1.0747582   0.79711426  0.04042766]

 [ 2.37827065  0.38552139 -0.86738029 -0.40430012 -0.80793767  0.09853577]

 [-0.15474449  0.29421379 -0.06848992 -0.14764467 -0.20048994 -0.90540357]]

[0 0 4 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 4 4 0 4 4 2 4 0 0 2 1 2 4 4 4 4 4 0 1

 4 4 0 0 0 0 0 0 0 4 4 4 0 4 4 4 0 0 4 4 4 4 4 0 4 0 3 4 0 3 3 3 3 3 4 0 4

 4 2 4 4 4 2 2 4 2 2 2 0 0 2 0 0 3 0 0 1 0 4 0 1 0 4 0 4 1 4 4 2 4 4 3 1 3

 4 3 1 3 4 3 2 4 2 4 0 0 1 2 0 0 0 0 4 1 4 4 0 4 0 2 2 4 4 0 0 0 0 0 2 1 1

 1 1 4 4 4 1 1 1 0 4 3 3 0 4 0 0 4 0 4 0 0 0 0 0 0 0 3 4 0 4 4 4 4 1 3 0 3

 0 0 3 0 0 4 0 3 1 0 1 0 1 2 1 0 2 4 3 2]

 

步骤序号

15

步骤名称

dbscan聚类

步骤描述

 

代码及讲解

from sklearn.cluster import DBSCAN

 

dbscan = DBSCAN(eps=3, min_samples=2).fit(x_scaled)

labels = dbscan.labels_

 

print(labels)

输出结果及其解读

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0

 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

 

步骤序号

16

步骤名称

层次聚类

步骤描述

 

代码及讲解

from sklearn.cluster import AgglomerativeClustering

agg = AgglomerativeClustering(n_clusters=5).fit(x_scaled)

labels = agg.labels_

 

print(labels)

输出结果及其解读

[1 1 1 2 2 2 2 0 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 4 0 4 2 2 2 2 2 2 0

 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 3 3 3 3 3 1 1 1

 1 4 1 1 1 4 4 1 4 4 4 1 1 4 2 1 3 1 1 0 1 1 1 0 1 1 1 2 0 2 1 2 1 1 3 0 3

 1 3 0 3 1 3 2 1 4 1 1 1 0 4 1 0 0 0 1 0 2 2 2 2 2 2 2 0 0 0 0 0 2 0 0 0 0

 0 0 1 1 1 0 0 0 1 1 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 2 2 1 1 1 0 3 2 3

 2 2 3 2 2 2 2 3 0 1 0 1 0 4 0 1 4 1 3 4]

 

 

8        实验结果及解读

KMeans和层次聚类都有比较好的聚类效果,dbscan的聚类结果有一些问题。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。