Springboot 一帧数据 Nmap 压制组装机 leetcodeLCP iframe installation timer dns mono handlebarsjs Minjs cocos2d html5 jquery each 大数据项目开发案例 oracle给表增加字段 idea开发python python库 python中get函数 python环境变量 python入门例子 java数据类型 java求和 java获取ip地址 java实例方法 linux命令行大全 linux服务器登录 网页游戏开发入门 wps2011 kmservice js数组移除指定元素 firework下载 小票打印 php递归 wmiprvse是什么进程 淘宝抽奖活动 vs2008中文版下载 苹果手机常去地点 微信昵称特殊字符保存 qq浏览器手机
当前位置: 首页 > 学习教程  > python

Kmeans吴恩达机器学习

2021/2/6 22:26:40 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

K-means算法 一、导入库和数据 %matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.io import loadmatmat loadmat(/Users/renjianmei/Downloads/机器学习/吴恩达编程作业/machine-learning-ex7/ex7/ex7data2.mat) mat…

K-means算法

一、导入库和数据

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat

mat = loadmat('/Users/renjianmei/Downloads/机器学习/吴恩达编程作业/machine-learning-ex7/ex7/ex7data2.mat')
mat.keys()
#dict_keys(['__header__', '__version__', '__globals__', 'X'])

X = mat['X']
X.shape    #(300, 2)

二、定义簇分配函数

def findClosestCentroids(X,centroids):
    idx=[]
    max_dist = 100000
    for i in range(len(X)):
        minus=X[i]-centroids  #数组的广播机制
        dist=minus[:,0]**2 + minus[:,1]**2    #(+minus[:,2]**2) 这里具体加到多少根据X.shape[1]的维数
        if dist.min() < max_dist: #这里是限制一下最大距离
            ci = np.argmin(dist)
            idx.append(ci)
    return np.array(idx)

三、定义聚类中心函数

def computeCentroids(X,idx):
    centroids=[]
    for i in np.unique(idx):  
 #与 for i in range(len(np.unique(idx))):等价   
#np.unique()除去数组中重复的数字,并进行排序之后输出
        u_i=X[idx==i].mean(axis=0)
        centroids.append(u_i)
    return np.array(centroids)

四、可视化

def plotData(X,centroids,idx=None):
    
    colors = ['b','g','gold','darkorange','salmon','olivedrab', 
              'maroon', 'navy', 'sienna', 'tomato', 'lightgray', 'gainsboro'
             'coral', 'aliceblue', 'dimgray', 'mintcream', 'mintcream']
    
    assert len(centroids[0]) <= len(colors), 'colors not enough '
    
    subX=[]
    if idx is not None:
        for i in range(centroids[0].shape[0]):
            x_i=X[idx==i]
            subX.append(x_i)
    else:
        subX=[X]
    
    # 分别画出每个簇的点,并着不同的颜色
    plt.figure(figsize=(8,5))
    for i in range(len(subX)):
        xx=subX[i]
        plt.scatter(xx[:,0],xx[:,1],c=colors[i],label='Cluster %d'%i)
        plt.legend()
        plt.xlabel('x1',fontsize=14)
        plt.ylabel('y1',fontsize=14)
        plt.title('X points',fontsize=16)
    
    # 画出簇中心点的移动轨迹
    xx,yy=[],[]
    for centroid in centroids:
        xx.append(centroid[:,0])
        yy.append(centroid[:,1])
        
    plt.plot(xx,yy,'rx--',markersize=8)            

初始化簇中心

init_centroids = np.array([[3, 3], [6, 2], [8, 5]])  # K=3 ,三个簇

idx=findClosestCentroids(X,init_centroids)
plotData(X,[init_centroids])

结果为:
在这里插入图片描述

五、Kmeans迭代函数

def runKmeans(X,centroids,iters):
    centroids_all=[]
    centroids_all.append(centroids)
    centroids_i=centroids
    for i in range(iters):
        idx=findClosestCentroids(X,centroids_i)
        centroids_i=computeCentroids(X,idx)
        centroids_all.append(centroids_i)
    return idx,centroids_all
idx,centroids_all=runKmeans(X,init_centroids,20)
plotData(X,centroids_all,idx)

结果为:
在这里插入图片描述
在实践中,对簇中心点进行初始化通常是从训练集中随机选择。

def initCentroids(X,K):
    m,n = X.shape
    idx=np.random.choice(m,K)    #从m中随机选择K个,以数组的形式返回
    centroids=X[idx] 
    return centroids
for i in range(3):
    centroids = initCentroids(X,3)
    idx,centroids_all=runKmeans(X,centroids,10)
    plotData(X,centroids_all,idx)

结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、用Kmeans进行图片压缩

from skimage import io
A=io.imread('/Users/renjianmei/Downloads/机器学习/吴恩达编程作业/machine-learning-ex7/ex7/bird_small.png')#用于读取图片文件。读取的图片为GRB格式。
#输出图片格式为数组形式
A.shape   #(128, 128, 3)
plt.imshow(A)

在这里插入图片描述

A.max()  #255
A=A/255  #做归一化处理

X=A.reshape(-1,3)  #将A转化为一个二维数组  (16384, 3)
K=16
centroids=initCentroids(X,K)

要注意centroids[1]的维数

def findClosestCentroids(X,centroids):
    idx=[]
    max_dist=1000000
    for i in range(len(X)):
        minus=X[i]-centroids
        dist=minus[:,0]**2+minus[:,1]**2+minus[:,2]**2    ###注意这里的维数
        if dist.min() < max_dist:
            ci=np.argmin(dist)
            idx.append(ci)
    return np.array(idx)

def computeCentroids(X,idx):
    centroids=[]
    for i in np.unique(idx):   #与 for i in range(len(np.unique(idx))):等价   
#np.unique()除去数组中重复的数字,并进行排序之后输出
        u_i=X[idx==i].mean(axis=0)
        centroids.append(u_i)
    return np.array(centroids)
       
def runKmeans(X,centroids,iters):
    centroids_all=[]
    centroids_all.append(centroids)
    centroids_i=centroids
    for i in range(iters):
        idx=findClosestCentroids(X,centroids_i)
        centroids_i=computeCentroids(X,idx)
        centroids_all.append(centroids_i)
    return idx,centroids_all
  
 '''
 def findClosestCentroids_(X,centroids):
    idx=[]
    for i in range(len(X)):
        minus=X[i]-centroids
        dist=0
        for j in range(minus.shape[1]):   ##通过循环来求dist
            dist += minus[:,j]**2
        ci=np.argmin(dist)
        idx.append(ci)
    return np.array(idx)
def runKmeans_(X,centroids,iters):
    centroids_all=[]
    centroids_all.append(centroids)
    centroid_i=centroids
    for i in range(iters):
        idx=findClosestCentroids_(X,centroid_i)  ##
        centroid_i=computeCentroids(X,idx)
        centroids_all.append(centroid_i)
    return idx,centroids_all
'''
#是等价的
idx, centroids_all = runKmeans(X, centroids, 10)
#  idx_, centroids_all_ = runKmeans_(X, centroids, 10)
'''sum=0
for i in range(len(centroids_all)):
    if (centroids_all[i]==centroids_all_[i]).all():
        sum+=1
    else:
        print(i)''' #证明这两种是等价的。
img=np.zeros(X.shape)
centroids=centroids_all[-1]
for i in range(len(centroids)):
    img[idx==i]=centroids[i]  
img=img.reshape(128,128,3)

fig,axes=plt.subplots(1,2,figsize=(12,6))
axes[0].imshow(A)
axes[1].imshow(img)
#imshow with RGB data ([0..1] for floats or [0..255] for integers)

在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_2000104.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?