使用ukb的seed数据集来实现k-means聚类算法,变更聚类中心和聚类簇数,并用散点图来表示

首先导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv

from sklearn.manifold import TSNE
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
from sklearn import metrics
from sklearn.metrics.cluster import fowlkes_mallows_score

1.读取该数据集seeds_dataset.txt,以\t+为分隔符

seeds = pd.read_csv('seeds_dataset.txt',header = None,sep="\t+",engine='python')
#print(seeds)

2.将数据的前7列作为待分析数据data,第7列target

seeds = pd.read_csv('seeds_dataset.txt',header = None,sep="\t+",engine='python')
#print(seeds)

3.对数据集进行离差标准化处理

seeds_data = seeds.values[1:210, 0:7]
seeds_target = seeds.values[1:, 7]
seeds_names = seeds.values[1, 0:7]
scale = MinMaxScaler().fit(seeds_data)
seeds_dataScale = scale.transform(seeds_data)
#print("执行标准差标准化后的数据:\t", seeds_dataScale)

4.利用Kmeans对数据进行聚类分析

要求聚为3类,k=2,3,4,设置三组不同的k值

k_values = [3]
#修改了k_values为4的时候,自定义初始化中心点记得要变成一个四行的矩阵,为5的时候要变成五行的矩阵
# 设置三组不同的初始中心点,我们定义了三个不同的k值(3、4、5)和三种不同的初始中心点策略(随机选择、k-means++和自定义初始中心点)
init_methods = ['random', 'k-means++', np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7],
                                                 [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8],
                                                 [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]])]

seeds = np.array(seeds)
for i in range(1, 210):
    for j in range(0, 7):
        seeds[i, j] = np.float64(seeds[i, j])

# kmeans = KMeans(n_clusters=3, random_state=123).fit(seeds_dataScale)

for k in k_values:
    for init_method in init_methods:
        # 运行K均值聚类算法
        kmeans = KMeans(n_clusters=k, init=init_method, random_state=123).fit(seeds_dataScale)
        # 输出聚类结果和评价指标,init_method三种初始化中心点策略
        print(f"k={k}, init_method={init_method}")
        score = fowlkes_mallows_score(seeds_target, kmeans.labels_)
        print('聚%d类FMI评价分值为:%f' % (k, score))
        print("轮廓系数={}".format(metrics.silhouette_score(seeds_dataScale, kmeans.labels_, metric='euclidean')))

        # 使用TSNE进行数据降维,降成两维
        tsne = TSNE(n_components=2, init='random', random_state=123).fit(seeds_data)
        df = pd.DataFrame(tsne.embedding_)  # 将原始数据转换为DataFrame
        df['labels'] = kmeans.labels_  # 将聚类结果存储进df数据表

        # 提取不同标签的数据
        #修改了k_values为4的时候,要定义到df4,同理为5的时候要定义到df5
        df1 = df[df['labels'] == 0]
        df2 = df[df['labels'] == 1]
        df3 = df[df['labels'] == 2]

        # 绘制图形
        fig = plt.figure(figsize=(9, 6))  # 设定空白画布,并制定大小
        # 用不同的颜色表示不同数据
        #修改了k_values为4的时候,记得多加一个图形
        plt.plot(df1[0], df1[1], 'bo', label='Cluster 1')
        plt.plot(df2[0], df2[1], 'r*', label='Cluster 2')
        plt.plot(df3[0], df3[1], 'gD', label='Cluster 3')

        plt.legend()
        plt.show()  # 显示图片

结果展示,只展示了k=3的结果
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值