ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

## 吴恩达第七周作业 K-means python(实现)

2021-11-30 21:02:32  阅读:181  来源: 互联网

标签:吴恩达 plt img idx means ## initial centroids shape


吴恩达第七周作业 K-means python(实现)

最新版K-means修正,可能可以解决部分学者的问题

声明:有参考别的博客,但是有自己修正

主函数1

DataFile1 = 'ex7data2.mat' #读取mat文件
parameter_Data=scio.loadmat(DataFile1)
X=parameter_Data['X']#X:300x2
K=3#三分类
initial_centroids=np.array([[3,3],[6,2],[8,5]])#手动设置三个分类的坐标
idx=findClosestCentroids(X,initial_centroids)#更新各个坐标所属分类
centroids=computeCentroids(X,idx,K)#更新分类的坐标
idx, centroids_all = runKmeans(X, initial_centroids, 20)#迭代K-means20次
plotData(X, centroids_all, idx)#画图
random_initial_centroids=kMeansInitCentroids(X,K)#随机生成分类

工具函数部分

import random

import numpy as np
import matplotlib.pyplot as plt



def findClosestCentroids(X, initial_centroids):#计算每一个x所属分类
    K=initial_centroids.shape[0]#3x1
    idx=np.zeros((X.shape[0],1))#300x1
    for i in range(idx.shape[0]):
        min=10000
        index=0
        for j in range(K):
            c=(X[i][0]-initial_centroids[j][0])**2+(X[i][1]-initial_centroids[j][1])**2
            if c<min:
                min=c
                index=j
        idx[i]=index+1
    return idx
def computeCentroids(X,idx,K):#idx 是每一个x所属的类 重新计算分类点的坐标
    m = X.shape[0]
    n = X.shape[1]
    centroids = np.zeros((K, n))
    counts = np.zeros((K, n))
    for i in range(m):
        centroids[int(idx[i]-1)] += X[i]
        counts[int(idx[i]-1)] += 1
    centroids = centroids / counts
    return centroids



def runKmeans(X, centroids, max_iters):#K-means算法
    K = len(centroids)

    centroids_all = []
    centroids_all.append(centroids)
    centroid_i = centroids
    for i in range(max_iters):
        idx = findClosestCentroids(X, centroid_i)
        centroid_i = computeCentroids(X, idx,K)
        centroids_all.append(centroid_i)

    return idx, centroids_all


def plotData(X, centroids, idx=None):#画图
    """
    可视化聚类结果和簇中心的移动过程
    :param X: ndarray,所有的数据
    :param idx: ndarray,每个数据所属类标签
    :param centroids_all: [ndarray,...]计算过程中每轮的簇中心
    :return: None
    """
    plt.scatter(X[..., 0], X[..., 1], c=idx)
    xx = []
    yy = []
    for c in centroids:
        xx.append(c[..., 0])
        yy.append(c[..., 1])
    plt.plot(xx, yy, 'rx--')
    plt.show()

def kMeansInitCentroids(X,K):#随机初始化!,注意:笔者这里使用了numpy.random.shuffle(),导致原数据顺序都错乱了,特此感谢别的博主
    """随机初始化"""
    m, n = X.shape
    idx = np.random.choice(m, K)
    centroids = X[idx]
    return centroids

#主函数2(图片压缩)
A = io.imread('bird_small.png')#(128, 128, 3)
A = A/255 
X = A.reshape(16384, 3)
K = 16
centroids = kMeansInitCentroids(X, K)
plt.imshow(A);
plt.show()
idx, centroids_all = runKmeans(X, centroids, 10)#idx:(16384, 1)
img = np.zeros(X.shape)#img:(16384, 3)
centroids = centroids_all[-1]#centroids:(16, 3)
for i in range(len(idx)):
    img[i] = centroids[int(idx[i]-1)]#这里要注意,别的博客不知道是否真的实现,感觉它们的语法有点问题,如果我的理解有误,请指正,
img = img.reshape((128, 128, 3))#还原图片
plt.imshow(img);
plt.show()

标签:吴恩达,plt,img,idx,means,##,initial,centroids,shape
来源: https://blog.csdn.net/vince1998/article/details/121642175

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有