机器学习练习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.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主成分分析相关推荐
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- 机器学习算法之 K 均值聚类
机器学习算法之 K 均值聚类 本文我们来学习一下另一种经常听到的机器学习算法-- K 均值聚类. 这个名字确实跟"K 近邻"有些相像,但是要明确的是,"K 近邻" ...
- 中药材鉴别-方法:聚类;PCA 主成分分析;线性判别式分析;判别式检验
基于线性判别式的中药材鉴别问题的数学模型 摘要 本文旨在讨论如何利用中药材的光谱特征鉴别药材的种类及产地,主要运用 系统聚类,PCA 主成分分析,线性判别,判别式运用等方法,使用了 MATLAB,Ex ...
- python 图像压缩pca_在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
AI 人工智能 在Python中使用K-Means聚类和PCA主成分分析进行图像压缩 各位读者好,在这片文章中我们尝试使用sklearn库比较k-means聚类算法和主成分分析(PCA)在图像压缩上的 ...
- python机器学习库sklearn——k均值聚类
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...
- 机器学习实战-61:K均值聚类算法(K-Means)
K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...
- k means聚类算法_K-Means 聚类算法 20210108
说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...
- Python计算机视觉编程第六章——图像聚类(K-means聚类,DBSCAN聚类,层次聚类,谱聚类,PCA主成分分析)
Python计算机视觉编程 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 1.1 在主成分上可视化图像 1.1 像素聚类 (二)层次聚类 (三)谱聚类 图像聚类 ...
最新文章
- Linux 性能分析的前 60 秒
- 算法学习之路|D进制的A+B
- sphinx是支持结果聚类的——WHERE、ORDER BY和GROUP BY
- DDoS高防(国际)子产品发布,替代原本在DDoS高防IP中的海外线路。
- 开源中文bi_主流开源 BI 产品对比
- 命令执行——命令执行漏洞及(四)
- QQ在屏幕边缘自动隐藏不能正常显示
- 应用性能问题解决实际案例
- 地图市场三足鼎立:诺基亚官方确认与亚马逊合作
- qt 复制字符串_QT中字符串的转化与拼接
- hutool中的threadutil_Hutool
- 又一场“人机大战”?来自AI open无情碾压!
- 深度学习之跟学霹雳吧啦Wz笔记
- antd修改Tooltip背景色
- cs1.5最新服务器地址,CS1.5服务器连接常见问题解决
- qiankun加载react子应用报错[import-html-entry]: error occurs while executing normal script
- 搭建一套直播平台需要多少钱
- ICC2: channel自动加soft blk方法
- 地理生物结业考_不到30天,初二学年地理、生物结业考试开考,老师们说……...
- javascript利用iframe打印pdf文档失败的问题