利用kmeans 对数据聚类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

from model.resnet import resnet18
import torch
from PIL import Image
from sklearn.decomposition import PCA


vmodel_path = "G:/minfan/myTask/MSTC_FWI/dataset/npy/SEG_trainData_130groups_1channels_201x301_vmodelData.npy"
vmodel = np.load(vmodel_path)

# Convert the NumPy array to a supported data type (e.g., float32)
vmodel = vmodel.astype(np.float32)

# Convert the NumPy array to a PyTorch tensor
vmodel_tensor = torch.tensor(vmodel)

vmodel_tensor = vmodel_tensor.reshape(vmodel_tensor.shape[0], 1, 201, 301)

# Using expand() method to convert to a 3-channel image  1通道扩展到3通道
expanded_vmodel_tensor = vmodel_tensor.expand(-1,  3, -1, -1)


# 加载预训练的ResNet模型,并移除最后的全连接分类层, 只提取特征
resnet = resnet18(pretrained=True)
resnet = torch.nn.Sequential(*list(resnet.children())[:-1])  # 移除最后一层  提取特征

resnet.eval()  # 设置为评估模式,这将冻结模型的参数

# 提取特征向量
with torch.no_grad():
    output = resnet(expanded_vmodel_tensor)

# 获取特征向量
feature_vector = output.squeeze().numpy()

# 输出特征向量的形状
print("Feature Vector Shape:", feature_vector.shape)


# 使用 K-Means 算法进行聚类
n_clusters = 2  # 要聚类的簇数
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(feature_vector)
# 每个样本的聚类标签
labels = kmeans.labels_
print(labels)
# 聚类中心
cluster_centers = kmeans.cluster_centers_

'''

## 降维后显示方便可视化

# 使用PCA降维至2维
pca = PCA(n_components=2)
reduced_feature_vector = pca.fit_transform(feature_vector)

# 使用K-Means算法进行聚类
n_clusters = 2
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
kmeans.fit(reduced_feature_vector)
labels = kmeans.labels_
cluster_centers = kmeans.cluster_centers_
'''


# 可视化聚类结果
plt.scatter(feature_vector[:, 0], feature_vector[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='x', s=200, label='Centroids')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('K-Means Clustering')
plt.legend()
plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值