K-means高维与PCA降维

  • K-means高维聚类
  • PCA

查了很多博客,发现网上给出的K-means都是二维数据,没有高维示例,所以笔者将抄来的二维模板稍修改了一下,把Python实现的K-means高维聚类贴出来与大家共享,同时附一点PCA的实现(调用了三维作图,没有安包的可以删掉三维图)

K-means高维聚类

老师留的题目
Automatically determine the best cluster number K in k-means.
• Generate 1000 random N-Dimensional points;
• Try different K number;
• Compute SSE;
• Plot K-SSE figure;
• Choose the best K number (how to choose?).
Try different N number: 2, 3, 5, 10 Write the code in Jupyter Notebook Give me the screenshot of the code and results in Jupyter Notebook

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
N=2                                                #维度def distance_fun(p1, p2, N):result=0for i in range(0,N):result=result+((p1[i]-p2[i])**2)return np.sqrt(result)def mean_fun(a):return np.mean(a,axis=0)def farthest(center_arr, arr):f = [0, 0]max_d = 0for e in arr:d = 0for i in range(center_arr.__len__()):d = d + np.sqrt(distance_fun(center_arr[i], e, N))if d > max_d:max_d = df = ereturn fdef closest(a, arr):c = arr[1]min_d = distance_fun(a, arr[1])arr = arr[1:]for e in arr:d = distance_fun(a, e)if d < min_d:min_d = dc = ereturn cif __name__=="__main__":arr = np.random.randint(0,10000, size=(1000, 1, N))[:, 0, :]   #1000个0-10000随机数'''block1=  np.random.randint(0,2000, size=(100, 1, N))[:, 0, :]     #分区间生成随机数block2 = np.random.randint(2000,4000, size=(100, 1, N))[:, 0, :]block3 = np.random.randint(4000,6000, size=(100, 1, N))[:, 0, :]block4 = np.random.randint(6000,8000, size=(100, 1, N))[:, 0, :]block5 = np.random.randint(8000,10000, size=(100, 1, N))[:, 0, :]arr=np.vstack((block1,block2,block3,block4,block5))'''## 初始化聚类中心和聚类容器K = 5r = np.random.randint(arr.__len__() - 1)center_arr = np.array([arr[r]])cla_arr = [[]]for i in range(K-1):k = farthest(center_arr, arr)center_arr = np.concatenate([center_arr, np.array([k])])cla_arr.append([])## 迭代聚类n = 20cla_temp = cla_arrfor i in range(n):    for e in arr:    ki = 0        min_d = distance_fun(e, center_arr[ki],N)for j in range(1, center_arr.__len__()):if distance_fun(e, center_arr[j],N) < min_d:    min_d = distance_fun(e, center_arr[j],N)ki = jcla_temp[ki].append(e)for k in range(center_arr.__len__()):if n - 1 == i:breakcenter_arr[k] = mean_fun(cla_temp[k])cla_temp[k] = []if N>=2:print(N,'维数据前两维投影') col = ['gold', 'blue', 'violet', 'cyan', 'red','black','lime','brown','silver']plt.figure(figsize=(10, 10))for i in range(K):plt.scatter(center_arr[i][0], center_arr[i][1], color=col[i])plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])plt.show()if N>=3:print(N,'维数据前三维投影')fig = plt.figure(figsize=(8, 8))ax = Axes3D(fig)for i in range(K):ax.scatter(center_arr[i][0], center_arr[i][1], center_arr[i][2], color=col[i])ax.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]],[e[2] for e in cla_temp[i]], color=col[i])plt.show()print(N,'维')for i in range(K):print('第',i+1,'个聚类中心坐标:')for j in range(0,N):print(center_arr[i][j])

首先解释一下代码,N为生成随机数字的维数,K为聚类中心数。
随机数我设定了两个部分,一个是0-10000完全随机数,另一个是0-10000均分成五个区间生成随机数。为什么要这么做呢?因为这样可以判别分类结果的正确与否。

如图
这是K=5时的完全随机数结果,可以看到初步分类正确

K=5时三维的完全随机数结果,可以看到初步分类正确

下面我们用区间生成随机数,这样可以直观地判别均值迭代好坏


可以看到分区间产生的随机数能够非常好地展示出算法的准确性,说明迭代的效果是理想的。

下面我们来看更高维情况,如果N>=4时,图像没有办法直观显示了,我们只能依次取出N中的3维或2维做投影来观察。为了直接验证高维情况的正确与否,我们不再一张张地作图,而是直接判断聚类中心的坐标是否在随机数区间内。(此时就体现出分区间的随机数据及其重要)


5个聚类中心都在理想区间内,结果同样正确。

更新补一下:SSE的实现

sse[i]=sse[i]+distance_fun(e, center_arr[ki],N)

在迭代中加个数组存放每次残差平方和数据
SSE图像大致如下:

很多时候会有小小的波折,暂时还没想清楚数学原理

PCA

题目
• Generate 5,00,000 random points with 200-D
• Dimension reduction to keep 90% energy using PCA
• Report how many dimensions are kept
• Compute k-means (k=100)
• Compare brute force NN and kd-tree, and report their running time
• Python, Jupyter Notebook

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
N=200                                                #维度                   def distance_fun(p1, p2, N):result=0for i in range(0,N):result=result+((p1[i]-p2[i])**2)return np.sqrt(result)def mean_fun(a):return np.mean(a,axis=0)def farthest(center_arr, arr):f = [0, 0]max_d = 0for e in arr:d = 0for i in range(center_arr.__len__()):d = d + np.sqrt(distance_fun(center_arr[i], e, N))if d > max_d:max_d = df = ereturn fdef closest(a, arr):c = arr[1]min_d = distance_fun(a, arr[1])arr = arr[1:]for e in arr:d = distance_fun(a, e)if d < min_d:min_d = dc = ereturn cdef pca(XMat):average = mean_fun(XMat) m, n = np.shape(XMat)data_adjust = []avgs = np.tile(average, (m, 1))data_adjust = XMat - avgscovX = np.cov(data_adjust.T)   #计算协方差矩阵featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量index = np.argsort(-featValue) #依照featValue进行从大到小排序sumfeatvalue=sum(index)sumt=0k=0while(sumt<0.9*sumfeatvalue):sumt+=index[k]k+=1finalData = []selectVec = np.matrix(featVec.T[index]) #所以这里须要进行转置finalData = data_adjust * selectVec.T reconData = (finalData * selectVec) + average  return finalData, reconData,kdef plotBestFit(data1, data2):    dataArr1 = np.array(data1)dataArr2 = np.array(data2)m = np.shape(dataArr1)[0]axis_x1 = []axis_y1 = []axis_x2 = []axis_y2 = []for i in range(m):axis_x1.append(dataArr1[i,0])axis_y1.append(dataArr1[i,1])axis_x2.append(dataArr2[i,0]) axis_y2.append(dataArr2[i,1])                 fig = plt.figure(figsize=(10, 10))ax = fig.add_subplot(111)#ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')ax.scatter(axis_x2, axis_y2, s=1, c='blue')plt.show()  if __name__ == "__main__":'''arr = np.random.randint(0,10000, size=(1000, 1, N))[:, 0, :]XMat=arr'''block1=  np.random.randint(0,2000, size=(100000, 1, N))[:, 0, :]     #分区间生成随机数block2 = np.random.randint(2000,4000, size=(100000, 1, N))[:, 0, :]block3 = np.random.randint(4000,6000, size=(100000, 1, N))[:, 0, :]block4 = np.random.randint(6000,8000, size=(100000, 1, N))[:, 0, :]block5 = np.random.randint(8000,10000, size=(100000, 1, N))[:, 0, :]XMat=np.vstack((block1,block2,block3,block4,block5))finalData, reconMat,pcaN = pca(XMat) plotBestFit(finalData, reconMat)   #输出前两维切片检查效果print('降维到:',pcaN)

由于数据量很大,计算时间在几十秒左右,降维后200维大概到150维左右。PCA控制有两种方法,一种是根据特征值保留量计算应降维数,就像本题中的0.9。或者可以指定下降后维数,可以直接定量转换,但这种方法在实际中很不常用,因为当数据维度很高时,我们是无法直观的预知应降的维数的。代码中作图有两个部分,未偏移的降维数据和偏移后的降维数据,前者我注释掉了,可以跟据需求自己修改。

下面皮一下,200维降到二维看一下图像(只展示偏移后降维数据):

可以看到,分区间随机数的特征值基本还保留,效果蛮好,继续K-means也可以得到较好的结果,但这并不意味着我们可以直接指定下降后的维数。因为实际问题中的分类。远远比这简单的五个区间复杂,肆意指定维数会造成不可预计的数据丢失。

K-means高维聚类与PCA降维相关推荐

  1. 机器学习公开课笔记(8):k-means聚类和PCA降维

    K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...

  2. 【吴恩达】机器学习作业ex7--(k-means聚类)与(PCA降维)Python

    一.前言 此次还是分为俩个部分,第一部分是利用k-means算法进行聚类,第一部分分为俩小步骤,第一步为给好的数据集进行分类(ex7data2),第二步是利用k-means算法来对图片进行压缩,然后第 ...

  3. 特征工程之PCA降维(主成分分析)总结

    目录 1.PCA是什么 2. 算法思路 详细推算 特征值分解 优缺点 参考链接: 1.PCA是什么 PCA是什么? PCA(Principal Component Analysis)是一种常用的数据分 ...

  4. 非监督学习-Apriori(关联),PCA(降维), k-means(聚类)

    Apriori算法原理总结 - 刘建平Pinard - 博客园Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策.比如 ...

  5. 高维数据PCA降维可视化(KNN分类)

    在做机器学习的时候,经常会遇到三个特征以上的数据,这类数据通常被称为高维数据.数据做好类别分类后,通过二维图或者三维图进行可视化,对于高维数据可以通过PCA(Principal Component A ...

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

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

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

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

  8. python 降维 聚类_比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南

    作者介绍:Saurabh.jaju2 Saurabh是一名数据科学家和软件工程师,熟练分析各种数据集和开发智能应用程序.他目前正在加州大学伯克利分校攻读信息和数据科学硕士学位,热衷于开发基于数据科学的 ...

  9. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

最新文章

  1. iOS开发指南 从Hello World到App Store上架 第5版
  2. django ContentType使用方法
  3. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)
  4. 三星s9没有推送android10,2月14日 三星Galaxy S9/S9+开始推送Android 9.0正式版
  5. python采集_Python采集实例1
  6. linux prel安装_Linux下Perl的安装(转)
  7. 2018年我国视频监控市场趋势:智能视频分析进入规模化
  8. 3-8 基于SpringBoot连接数据库与配置MyBatis实操 创建表sql
  9. 以Spring方式构建企业Java应用程序
  10. 求第k小的数(洛谷P1923题题解,Java/C++语言描述)
  11. HTML5安全风险详析之三:WebSQL攻击
  12. bind配置进阶,转发器的配置以及如何实现子域授权。
  13. redis在php下面的命令大全
  14. PMP课程笔记:第7章 项目成本管理
  15. 笔记本计算机并行口什么开启,笔记本连接电脑台式机的方法
  16. loj121-动态图连通性
  17. 采访UI设计师Kiro
  18. html文件用word打开是乱码,Word文档打开是乱码怎么解决
  19. Zhong__Python reduce()
  20. mysql存储过程select into_mysql存储过程select into

热门文章

  1. ui设计师与android,总算知道ui设计师适配的知识点
  2. python3使用mbruteforce报错
  3. Win11最新KB5019980(22621.819)更新内容详解
  4. 华为ITR服务变革与转型的启发!ITR与LTC和IPD啥关系?华为许浩明老师分享(原创)
  5. BP神经网络实现风功率预测
  6. BIM技术到底是什么技术?学会了可以从事什么工作?
  7. BIM IFC模型在线查看工具
  8. 残留物与电子PCBA 的可靠性和三防漆涂敷前后可能导致电路板出现故障的变量
  9. 【Python】Numpy处理多项式类Polynomial
  10. 【阿里云建站】云服务器能免费送?