机器学习练习7-K-means聚类和PCA主成分分析

本文基于Andrew_Ng的ML课程作业

1-K-means clustering used for simple two-dimensional datasets: K-means聚类用于简单二维数据集

导入库

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat

函数:初始化聚类中心

def init_centroids(X,k):    #初始化聚类中心
    m,n=X.shape
    centroids=np.zeros((k,n))
    idx=np.random.randint(0,m,k)    #np.random.randint(low,high=None,size=None):返回size规模在[low, high)范围内的随机整型数
    for i in range(k):
        centroids[i,:]=X[idx[i],:]
    return centroids

函数:找到每个样本最接近的聚类中心(Cluster Assignment)

def find_closet_centroids(X,centroids): #找到每个样本最接近的聚类中心(Cluster Assignment)
    m=X.shape[0]
    k=centroids.shape[0]
    idx=np.zeros(m)
    for i in range(m):
        min_distan=1000000    #最小距离先设置为一个极大值
        for j in range(k):
            distan_squ=np.sum((X[i,:]-centroids[j,:])**2)   #第i个样本到第j个centroid距离的平方
            if distan_squ < min_distan:
                min_distan=distan_squ
                idx[i]=j+1
    return idx

函数:计算簇的聚类中心(分配给簇的所有样本的平均值)(Move Centroid)

def compute_centroids(X,idx,k): #计算簇的聚类中心(分配给簇的所有样本的平均值)(Move Centroid)
    n=X.shape[1]
    centroids=np.zeros((k,n))
    for i in range(k):
        indices=np.where(idx==i+1)    #np.where(condition):条件成立时,where返回每个符合condition条件元素的坐标,以元组的形式
        centroids[i,:]=(np.sum(X[indices,:],axis=1)/len(indices[0]))    #np.sum(X,axis=1):X为[[[],[]]]时,axis=1表示每一列元素相加,列数不变   #len(list):行数;len(list[0]):列数
    return centroids

函数:加入循环整合后的K-means算法

def K_means(X,initial_centroids,max_iters): #加入循环整合后的K-means算法
    k=initial_centroids.shape[0]
    centroids=initial_centroids
    for i in range(max_iters):
        idx=find_closet_centroids(X,centroids)
        centroids=compute_centroids(X,idx,k)
    return idx,centroids

函数:用三种不同颜色展示三种聚类

def plot_clusters():    #用三种不同颜色展示三种聚类
    cluster1=X[np.where(idx==1)[0],:]   #这里np.where()后要加[0]是因为返回的是多元素array,取第一个元素才是每个符合condition条件元素的坐标
    cluster2=X[np.where(idx==2)[0],:]
    cluster3=X[np.where(idx==3)[0],:]
    fig,ax=plt.subplots(figsize=(12,8))
    ax.scatter(cluster1[:,0],cluster1[:,1],s=30,color='r',label='Cluster 1')
    ax.scatter(cluster2[:,0],cluster2[:,1],s=30,color='g',label='Cluster 1')
    ax.scatter(cluster3[:,0],cluster3[:,1],s=30,color='b',label='Cluster 1')
    ax.legend()
    pl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值