本文基于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.shapecentroids=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_squidx[i]=j+1return 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_centroidsfor 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()plt.show()

主函数:

#K-means clustering used for simple two-dimensional datasets: K-means聚类用于简单二维数据集data=loadmat('ex7data2.mat')
X=data['X'] #(300,2)
initial_centroids=init_centroids(X,3)
max_iters=10
idx,centroids=K_means(X,initial_centroids,max_iters)
plot_clusters()

用三种颜色展示三种聚类

2-K-means clustering used for image compressing: K-means聚类用于压缩图像

导入库

from IPython.display import display,Image
from scipy.io import loadmat
import numpy as np
import matplotlib.pyplot as plt

函数:初始化聚类中心

def init_centroids(X,k):    #初始化聚类中心m,n=X.shapecentroids=np.zeros((k,n))idx=np.random.randint(0,m,k)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=1000000for j in range(k):distan_squ=np.sum((X[i,:]-centroids[j,:])**2)if distan_squ < min_distan:min_distan=distan_squidx[i]=j+1return 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)centroids[i,:]=(np.sum(X[indices,:],axis=1)/len(indices[0]))return centroids

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

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

主函数:

#K-means clustering used for image compressing: K-means聚类用于压缩图像
#使用聚类找到最具代表性的16种少数颜色(16种选定颜色的RGB值),并使用聚类分配将原始的24位颜色映射到较低维的颜色空间
#在图像的直接24位颜色表示中,每个像素被表示为3个8位无符号整数(0~255),称为RGB编码
#原始图像的128×128像素位置中的每一个都需要24位(3x8),因此总大小为128×128×24=393216位;新的表示法需要以16种颜色的字典形式进行一些开销存储,每种颜色需要24位,但是图像本身只需要每个像素位置4位;因此最终使用的位数是16×24+128×128×4=65920位,相当于将原始图像压缩约6倍display(Image(filename='bird_small.png'))    #IPython.display.display:显示图像(仅在Jupyter中可用)    #IPython.display.Image:导入图像
image_data=loadmat('bird_small.mat')
A=image_data['A']   #A.shape=(128,128,3)表示数组有三个维度,可以理解为有128张纸,每张纸上有一个128*3的矩阵#Data Preprocessing
A=A/255 #normalize value ranges
X=np.reshape(A,((A.shape[0]*A.shape[1]),A.shape[2]))    #将A reshape成两维initial_centroids=init_centroids(X,16)
max_iters=10
idx,centroids=K_means(X,initial_centroids,max_iters)    #idx.shape=(16384,);centroids.shape=(16,3)
idx=find_closet_centroids(X,centroids)  #上一次循环后有新的聚类中心但未对每个样本点进行附属,这一步就是新附属
X_recovered=np.zeros(X.shape)
for i in range(16):X_recovered[idx==i]=centroids[i]
X_recovered=X_recovered.reshape(128,128,3)
plt.imshow(X_recovered) #plt.imshow(X):热图(heatmap)通过色差、亮度来展示数据的差异;X:(M,N,3):具有RGB值的图像(RGB值应该在浮点数[0,...,1]或整数[0,...,255])
plt.show()

原图

压缩后图

3-K-means clustering in scikit-learn used for image compressing:K-means聚类用于压缩图像(用scikit-learn中的K-Means模型)

导入库

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

主函数:

#K-means clustering in scikit-learn used for image compressing:K-means聚类用于压缩图像(用scikit-learn中的K-Means模型)pic=io.imread('bird_small.png')/255 #(128,128,3) #skimage.io.imread(fname):图像读取,fname为文件名,这里图像读取进来就是RGB格式
io.imshow(pic)  #skimage.io.imshow(arr):图片显示1,arr为要显示的图像数组
io.show()   ##skimage.io.show():图片显示2,相当于plt.show()
data=pic.reshape(128*128,3)model=KMeans(n_clusters=16,n_init=100)  #sklearn.cluster.KMeans(init=,max_iter=,n_clusters=,n_init=):n_clusters:聚类数量,即k值,默认为8;init:初始化聚类中心的方法,如需自定义设置,则传入ndarray格式的参数;n_init:用不同的初始化聚类中心运行算法的次数,默认为10,如自定义设置初始聚类中心,则为1;max_iter:最大迭代次数,默认300
model.fit(data)
centroids=model.cluster_centers_    #Kmeans.cluster_centers_:求取聚类中心
idx=model.predict(data) #求取样本属于哪个聚类的索引
compressed_pic=np.zeros(data.shape)
for i in range(16):compressed_pic[idx==i]=centroids[i]
compressed_pic=compressed_pic.reshape(128,128,3)
fig,ax=plt.subplots(1,2)
ax[0].imshow(pic)
ax[1].imshow(compressed_pic)
plt.show()

原始图和压缩后图对比

4-Principal Component Analysis used for dimensional reduction of simple two-dimensional datasets: PCA主成分分析用于简单二维数据集的降维

导入库

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

函数:实施PCA

def PCA(X): #实施PCA#Data Preprocessing:Mean NormalizationX=(X-X.mean())/X.std()#Compute covariance matrixX=np.matrix(X)  #(50,2)cov=(X.T*X)/X.shape[0]  #(2,2)#Implement SVDU,S,V=np.linalg.svd(cov)    #np.linalg.svd(X):X维度(M,N),返回主成分矩阵U大小为(M,M),S(除了对角元素不为0其他元素都为0,作为一维矩阵返回)大小为(M,N),V大小为(N,N)return U,S,V

函数:选择主成分数量k

def Choose_k(X,S): #选择主成分数量kfor k in range(X.shape[1]):variance=np.sum(S[:k+1])/np.sum(S[:])if variance>0.99:return k

函数:将2维原始数据投射到1维空间中

def project_data(X,U,k):    #将2维原始数据投射到1维空间中Ureduce=U[:,:k] #(2,1)z=Ureduce.T*X.Treturn z.T

函数:通过反向转换来恢复原始数据

def recover_data(Z,U,k):    #通过反向转换来恢复原始数据Ureduce=U[:,:k]X_recovered=Ureduce*Z.Treturn X_recovered.T

主函数:

#Principal Component Analysis used for dimensional reduction of simple two-dimensional datasets: PCA主成分分析用于简单二维数据集的降维data=loadmat('ex7data1.mat')
X=data['X']
U,S,V=PCA(X)
print(U,S,V)
k=Choose_k(X,S)
Z=project_data(X,U,k)   #(50,1)
X_recovered=recover_data(Z,U,k)
fig,ax=plt.subplots(figsize=(12,8))
ax.scatter(list(X_recovered[:,0]),list(X_recovered[:,1]))   #list():将数据转换为列表类型  #这里转化成列表类型后画散点图否则报错
#第一主成分的投影轴基本上是数据集中的对角线,当我们将数据减少到一个维度时,我们失去了该对角线周围的变化,所以在再现中,一切都沿着该对角线
plt.show()

U,S,V

原始数据图

降维后再恢复的数据图

5-Principal Component Analysis used for dimensional reduction of face images: PCA主成分分析用于脸部图像数据集的降维

导入库

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

函数:实施PCA

def PCA(X): #实施PCAX=(X-X.mean())/X.std()X=np.matrix(X)cov=(X.T*X)/X.shape[0]U,S,V=np.linalg.svd(cov)return U,S,V

函数:选择主成分数量k

def Choose_k(X,S): #选择主成分数量kfor k in range(X.shape[1]):variance=np.sum(S[:k+1])/np.sum(S[:])if variance>0.99:return k

函数:将2维原始数据投射到1维空间中

def project_data(X,U,k):    #将2维原始数据投射到1维空间中Ureduce=U[:,:k]z=Ureduce.T*X.Treturn z.T

函数:通过反向转换来恢复原始数据

def recover_data(Z,U,k):    #通过反向转换来恢复原始数据Ureduce=U[:,:k]X_recovered=Ureduce*Z.Treturn X_recovered.T

函数:渲染数据集中前n张图像

def plot_n_image(X,n):  #渲染数据集中前n张图像images=X[:n,:]pic_size=int(np.sqrt(X.shape[1]))   #np.sqrt(x):开平方grid_size=int(np.sqrt(n))fig,ax=plt.subplots(ncols=grid_size,nrows=grid_size,figsize=(8,8))for i in range(grid_size):for j in range(grid_size):ax[i][j].imshow(images[i*grid_size+j].reshape(pic_size,pic_size).T,cmap='OrRd_r')   #将每张图reshape成32*32灰度的图像ax[i][j].set_xticks([])ax[i][j].set_yticks([])plt.show()

主函数:

#Principal Component Analysis used for dimensional reduction of face images: PCA主成分分析用于脸部图像数据集的降维faces=loadmat('ex7faces.mat')
X=faces['X']    #(5000,1024)
plot_n_image(X,100)
face=np.reshape(X[3,:],(32,32)) #渲染后的原图片
plt.imshow(face,cmap='OrRd_r')
plt.show()
U,S,V=PCA(X)
k=Choose_k(X,S)
print(k)
Z=project_data(X,U,100)   #取k=100
X_recovered=recover_data(Z,U,100)
face=np.reshape(X_recovered[3,:],(32,32)) #使用PCA处理并渲染后的图片
plt.imshow(face,cmap='OrRd_r')
plt.show()

主成分数量k

渲染后的前100张图像

使用PCA前渲染后的原图像

使用PCA处理并渲染后的图片

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

  1. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  2. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  3. 机器学习算法之 K 均值聚类

    机器学习算法之 K 均值聚类 本文我们来学习一下另一种经常听到的机器学习算法-- K 均值聚类. 这个名字确实跟"K 近邻"有些相像,但是要明确的是,"K 近邻" ...

  4. 中药材鉴别-方法:聚类;PCA 主成分分析;线性判别式分析;判别式检验

    基于线性判别式的中药材鉴别问题的数学模型 摘要 本文旨在讨论如何利用中药材的光谱特征鉴别药材的种类及产地,主要运用 系统聚类,PCA 主成分分析,线性判别,判别式运用等方法,使用了 MATLAB,Ex ...

  5. python 图像压缩pca_在Python中使用K-Means聚类和PCA主成分分析进行图像压缩

    AI 人工智能 在Python中使用K-Means聚类和PCA主成分分析进行图像压缩 各位读者好,在这片文章中我们尝试使用sklearn库比较k-means聚类算法和主成分分析(PCA)在图像压缩上的 ...

  6. python机器学习库sklearn——k均值聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...

  7. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  8. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  9. Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)

    Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...

最新文章

  1. Linux 性能分析的前 60 秒
  2. 算法学习之路|D进制的A+B
  3. sphinx是支持结果聚类的——WHERE、ORDER BY和GROUP BY
  4. DDoS高防(国际)子产品发布,替代原本在DDoS高防IP中的海外线路。
  5. 开源中文bi_主流开源 BI 产品对比
  6. 命令执行——命令执行漏洞及(四)
  7. QQ在屏幕边缘自动隐藏不能正常显示
  8. 应用性能问题解决实际案例
  9. 地图市场三足鼎立:诺基亚官方确认与亚马逊合作
  10. qt 复制字符串_QT中字符串的转化与拼接
  11. hutool中的threadutil_Hutool
  12. 又一场“人机大战”?来自AI open无情碾压!
  13. 深度学习之跟学霹雳吧啦Wz笔记
  14. antd修改Tooltip背景色
  15. cs1.5最新服务器地址,CS1.5服务器连接常见问题解决
  16. qiankun加载react子应用报错[import-html-entry]: error occurs while executing normal script
  17. 搭建一套直播平台需要多少钱
  18. ICC2: channel自动加soft blk方法
  19. 地理生物结业考_不到30天,初二学年地理、生物结业考试开考,老师们说……...
  20. javascript利用iframe打印pdf文档失败的问题

热门文章

  1. influxdb与mysql的比较_DolphinDB与InfluxDB对比测试报告
  2. Ubuntu22+ROS2+QtCreator+Ros_Qtc_Plugin开发环境搭建
  3. 【计算机毕业设计】260火锅店管理系统
  4. 从中国移动财报透视:什么在支撑移动云发展韧性?
  5. 如何用LLMs来赚钱?基于ChatGPT的商业模式指南
  6. 日常工作笔记(持续更新中。。)
  7. 百度作业帮网上收集的面试题
  8. bootstrap响应式页面的一些感想
  9. GPUImage 的简单说明
  10. 公司到底需要招聘什么样的程序员?