吴恩达机器学习课后题---kmeans聚类

题目:对已知数据集进行聚类。最后对图片的像素值进行聚类

数据集:

https://www.heywhale.com/mw/project/5da961c8c83fb400420f3dd7/dataset

python代码:

#给定一个二维数据集,使用kmeans进行聚类
import numpy as np
import scipy.io as io
import matplotlib.pyplot as plt
#第一步 引入数据,可视化
data1 = io.loadmat('C:/Users/15100/Desktop/吴恩达机器学习数据集/week1/ex7data2.mat')
data1.keys() #获取列名
X = data1['X']
print(X.shape)
plt.scatter(X[:,0],X[:,1])
plt.show()

#第二步 定义函数
# 1、获取每个样本所属的类别
def find_centroids(X,centros):
    idx = [] #空类别
    for i in range(len(X)):
        #计算样本点到每类聚类中心点的距离,X为二维数组,centros是k*2维,运算后还是k*2,k表示类别数
        dist = np.linalg.norm((X[i] - centros),axis=1) #norm函数计算范数,axis按列,做了一个开方
        id_i = np.argmin(dist) #k个数据中返回最小距离索引
        idx.append(id_i)
    return np.array(idx)
centros = np.array([[3,3],[6,2],[8,5]]) #三行两列数组,表示划分为三个类别
idx = find_centroids(X,centros)
idx[:3] #三种类别

#2、计算聚类中心点
def compute_centros(X,idx,k):   #k为类别总数
    centros = [] #存放聚类中心点
    for i in range(k):
        centros_i = np.mean(X[idx == i], axis=0) #按行求每一列的均值
        centros.append(centros_i)
    return np.array(centros) #转化成数组
compute_centros(X,idx,k=3)

#第三步 观察初始聚类点的位置对聚类效果的影响
def init_centros(X,k):
    index = np.random.choice(len(X),k) #随机生成k个初始聚类点
    
    return X[index]
init_centros(X,k=3)
init_centros_all = run_kmeans(X,init_centros(X,k=3),iters=10) #执行聚类过程
plot_data(X,centros_all,idx)

######第二问求图片聚类
data = io.loadmat('C:/Users/15100/Desktop/吴恩达机器学习数据集/week1/bird_small.mat')
data.keys()
#读取数据集
A = data['A']
A.shape
#读取绘制图片
from skimage import io
image = io.imread('C:/Users/15100/Desktop/吴恩达机器学习数据集/week1/bird_small.png')
plt.imshow(image)
#第二步 聚类
A = A / 255
A = A.reshape(-1,3) #重组维度
k = 16
idx,centros_all = run_kmeans(A,init_centros(A,k=16),iters=10) #聚类
centros = centros_all[-1] #-1为最后一次
im = np.zeros(A.shape)
for i in range(k):
    im[idx==i] = centros[i]
im = im.reshape(128,128,3) #重新转化为三维3数组
plt.imshow(im)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值