python图像LLE降维K-means聚类

实现目标:

  • 对花的图片集进行LLE降维
  • 完成图片K-means聚类
  • 绘制系统聚类图

首先加载本地图片集

#导入本地图片集
import os
import cv2
array_of_img = [] #用于储存图片
#此函数用于读取图片,参数为本地路径名
def read_directory(directory_name):
    #循环读取这个路径中的每个图像
    for filename in os.listdir(directory_name):
        #print(filename)
        #img用于储存图像数据
        img = cv2.imread(directory_name + "/" + filename)#根据文件夹名称与文件名进行图像的读取
        array_of_img.append(img) #将图像数据存储到array_of_img中
        #print(img)
        #print(array_of_img)

调用函数

#使用read_directory函数加载本地图片集,图片放在D盘下的flowerpictures文件夹
read_directory('D:/flowerpictures/')

其次对图片集进行LLE降维

sklearn的manifold提供了LLE方法(LocallyLinearEmbedding)

n_neighbors:即我们搜索样本的近邻的个数,最重要的就是这个,默认值是5。n_neighbors个数越大,则建立样本局部关系的时间会越大,也就意味着算法的复杂度越大;同时n_neighbors个数越大,则降维后样本的局部关系会保持的更好。一般来说,如果算法运行时间可以接受,我们可以尽量选择一个比较大一些的n_neighbors。

n_components:即我们降维到的维数。如果我们降维的目的是可视化,则一般可以选择2-5维。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import NullFormatter
#sklearn的manifold提供了LLE方法(LocallyLinearEmbedding)
from sklearn import manifold, datasets

#处理图片集样本
n_points = len(array_of_img)
X, color = datasets.samples_generator.make_s_curve(n_points, random_state=0)
n_neighbors = 5

# LLE降维
n_components = 2 #保留2个主成分
Y = manifold.LocallyLinearEmbedding(n_neighbors, n_components).fit_transform(X)
#print(Y)

最后K-means聚类,并可视化聚类效果

import numpy as np
from sklearn.cluster import KMeans

#构造一个聚类数为3的聚类器
estimator = KMeans(n_clusters=3)#构造聚类器
estimator.fit(Y)#对降维后的图像数据Y进行聚类
label_pred = estimator.labels_ #获取聚类标签
centroids = estimator.cluster_centers_ #获取聚类中心
inertia = estimator.inertia_ # 获取聚类准则的总和

#设定不同的聚类数值k以运算
for k in range(2,10):
	clf = KMeans(n_clusters=k) #调用KMeans算法,聚类数为k
	s = clf.fit(Y) #加载数据集合
	numSamples = len(Y)
	centroids = clf.labels_
	print(centroids) #显示中心点
	print(clf.inertia_)  #显示聚类效果
	mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
	#画出所有样例点 属于同一分类的绘制同样的颜色
	for i in range(numSamples):
		#markIndex = int(clusterAssment[i, 0])
		plt.plot(Y[i][0], Y[i][1], mark[clf.labels_[i]]) #mark[markIndex])
	mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
	#画出质点,用特殊图型
	centroids =  clf.cluster_centers_
	for i in range(k):
		plt.plot(centroids[i][0], centroids[i][1], mark[i], markersize = 12)
		#print centroids[i, 0], centroids[i, 1]
	plt.show()

实现结果如图
k=2
k=3
k=4
k=5
k=6
k=7
k=8
k=9
感谢学习指导:
python读取文件夹下所有图片

人工智障学习笔记——机器学习(13)LLE降维

k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LLE(Locally Linear Embedding)是一种非线性降维算法,可以保留数据的局部结构。其基本思想是将高维数据映射到低维空间上,并保持数据之间的距离关系不变。以下是用Python实现LLE降维的代码: ```python import numpy as np from scipy.spatial.distance import cdist def lle(X, n_neighbors, n_components): # 计算输入数据的样本点数和维度 n_samples, n_features = X.shape # 计算样本点之间的欧几里得距离 dist = cdist(X, X, 'euclidean') # 对每个样本点,找到其最近的n_neighbors个样本点 neighbors = np.argsort(dist, axis=1)[:, 1:n_neighbors+1] # 初始化重建权重矩阵 W = np.zeros((n_samples, n_neighbors)) # 对每个样本点,计算其在最近的n_neighbors个样本点上的线性重建权重 for i in range(n_samples): Xi = X[neighbors[i]] Xi -= Xi.mean(axis=0) C = np.dot(Xi, Xi.T) w = np.linalg.solve(C, np.ones(n_neighbors)) w /= w.sum() W[i] = w # 计算降维后的低维表示 M = np.eye(n_samples) - W.T.dot(W) eigvals, eigvecs = np.linalg.eig(M) indices = eigvals.argsort()[:n_components] return eigvecs[:, indices].real ``` 其中,输入参数`X`是一个`n_samples`行`n_features`列的矩阵,表示样本数据。`n_neighbors`是一个整数,表示每个样本点选择的最近邻数。`n_components`是一个整数,表示降维后的维度。 函数首先计算输入数据样本点之间的欧几里得距离,并找到每个样本点的最近邻。然后,对于每个样本点,计算其在最近的n_neighbors个样本点上的线性重建权重。最后,使用重建权重矩阵计算降维后的低维表示,并返回降维后的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值