吴恩达机器学习作业Python实现(七):K-means和PCA

目录

1 K-means聚类 

1.1 K-means实现

1.1.1 找到最近的质心

1.1.2 计算质心

1.2 在示例数据集使用K-means算法

1.3 随机初始化

1.4 图像压缩

2 PCA

2.1 示例数据集

2.2 实现PCA

2.3  PCA降维

2.3.1 将数据投影在主成分上

2.3.2 重构数据

2.3.3 可视化

2.4 人脸数据集

2.4.1 对人脸图像使用PCA

2.4.2 降维

参考文章


1 K-means聚类

        在本练习中,您将会使用K-means算法实现并用于图像压缩,首先从一个2D数据集开始,帮助你对K-means算法的工作原理建立直观认识,之后再运用到图像压缩上,方法是减少图像中出现的颜色的数量,只保留图像中最常见的颜色。

1.1 K-means实现

        K-means算法是一种将相似的数据自动聚类的方法,具体来说,给你一个训练集,并希望将数据分组为几个内聚的簇,其背后是一个迭代的过程,从猜测初始的质心开始,然后通过反复将样例分配到它们最近的质心来改进这个猜测,然后根据分配重新计算质心。

        算法的内循环重复执行两个步骤

  • 将每个训练样本x(i)分配到最近的质心
  • 使用分配给它的点重新计算每个质心的平均值

        算法总是收敛域质心的某个最终均值集,需要注意的是收敛的解决方案并非理想的,它取决于质心的初始位置,因此在实际中,往往先让算法以不同的初始质心运行几次,在不同解中选择代价函数值最小的那个。

1.1.1 找到最近的质心

        在算法的聚类分配阶段,在给定质心的当前位置下,算法将每个训练样本x(i)分配到最近的簇中心,判断最近的标准采用以下公式

c^{(i)}:=j \ \ that \ minimizes\ \ \left \| x^{(i)} - \mu_{j} \right \|^{2}

c^{(i)} 表示离样本 x_{i} 最近的簇中心点的索引,\mu_{j} 是第j个簇中心点的坐标值

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat
from skimage import iodef findClosestCentroids(X, centroids):"""用于寻找最近簇中心点"""idx = []max_dist = 100000 # 限制最大距离for i in range(len(X)):
# 这里使用了numpy的广播机制,把X[i]广播成和centroids同纬度相减minus = X[i] - centroids  dist = minus[:,0]**2 + minus[:,1]**2 # 计算两点距离if dist.min() < max_dist: ci = np.argmin(dist)idx.append(ci)return np.array(idx)

        接下来使用作业提供的例子,自定义了簇中心点[3, 3], [6, 2], [8, 5],算出结果前三个点所属的簇中心应该是 [0, 2, 1]

data = loadmat(r'E:\Code\ML\ml_learning\ex7-kmeans and PCA\data\ex7data2.mat')
X = data['X']
init_centroids = np.array([[3, 3], [6, 2], [8, 5]])
idx = findClosestCentroids(X, init_centroids)
# idx[0:3] = [0, 2, 1]

1.1.2 计算质心

        根据样本在簇中心上的分配,算法的第二阶段是对每一个簇中心根据所分配到的样本,计算其平均值设定为簇中心的新坐标轴,公式如下

\mu_{k} = \frac{1}{|C_{k}|} \sum_{i \in C_{k}}x^{(i)}

 C_{k} 是分配给簇中心k的样本集,具体来说,如果 x^{(1)} 和 x^{(3)} 属于簇中心k = 3,则

\mu_{3} = \frac{1}{2}(x^{(1)}+x^{(3)})

def computerCentroids(X, idx):centroids = []for i in range(len(np.unique(idx))): #去除重复数据u_k = X[idx==i].mean(axis=0) #计算每个簇的均值,按列求centroids.append(u_k)return np.array(centroids)# computerCentroids(X, idx)
# array([[2.42830111, 3.15792418],
#        [5.81350331, 2.63365645],
#        [7.11938687, 3.6166844 ]])

1.2 在示例数据集使用K-means算法

        在完成算法的两个步骤之后,我们将在一个2D数据集运行K-means算法,并将每一次迭代簇中心的坐标可视化。

def runKmeans(X, centroids, max_iters): #最大迭代次数K = len(centroids) # 获得簇的个数centroids_all = [] #用于存放簇中心点移动过程的点centroids_all.append(centroids) # 初始点centroid_i = centroidsfor i in range(max_iters):idx = findClosestCentroids(X, centroid_i) # 获得每次簇中心点坐标centroid_i = computerCentroids(X, idx) # 得到新的簇中心坐标轴centroids_all.append(centroid_i)return idx, centroids_all
idx, centroids_all = runKmeans(X, init_centroids, 20)
plotData(X, centroids_all, idx)

1.3 随机初始化

        在实践中,对簇中心点进行初始化的一个好的策略就是从训练集中选择随机的例子。

def initCentroids(X, K):"""随机初始化"""m = X.shape[0]idx = np.random.choice(m, K) # 从m个点抽k个用于作索引centroids = X[idx]return centroids   
for i in range(3):# 随机初始化三次centroids = initCentroids(X,3)idx, centroids_all = runKmeans(X, centroids, 10)plotData(X, centroids_all, idx)

 

 

1.4 图像压缩

       这部分你将用K-means来进行图片压缩。在一个简单的24位颜色表示图像。每个像素被表示为三个8位无符号整数(从0到255),指定了红、绿和蓝色的强度值。这种编码通常被称为RGB编码。我们的图像包含数千种颜色,在这一部分的练习中,你将把颜色的数量减少到16种颜色。

        这可以有效地压缩照片。具体地说,您只需要存储16个选中颜色的RGB值,而对于图中的每个像素,现在只需要将该颜色的索引存储在该位置(只需要4 bits就能表示16种可能性)。接下来我们要用K-means算法选16种颜色,用于图片压缩。你将把原始图片的每个像素看作一个数据样本,然后利用K-means算法去找分组最好的16种颜色。

def imageCompression(path, K=16):"""图片压缩"""A = io.imread(path)A = A/255 # 将其归一到0-1X = A.reshape(-1, 3) # 把维度重塑为(128*128,3)centroids = initCentroids(X, K) # 获得初始簇中心点idx, centroids_all = runKmeans(X, centroids, 10) # 获得索引和簇中心点记录img = np.zeros(X.shape)  # 创建同纬度的空白照片centroids = centroids_all[-1] #取最后一次的簇中心点坐标for i in range(len(centroids)): #通过簇数分类像素点img[idx == i] = centroids[i]img = img.reshape((128, 128, 3)) #重塑为原维度fig, axes = plt.subplots(1, 2, figsize=(12,6))axes[0].imshow(A)axes[1].imshow(img)path = r'E:\Code\ML\ml_learning\ex7-kmeans and PCA\data\bird_small.png'
imageCompression(path, 16)

2 PCA

        在本练习中,将使用PCA进行降维,首先先在一个2D数据集上进行,直观了解PCA如何工作,接着在5000个人脸图像数据集上降维。

2.1 示例数据集

        为了帮助您理解PCA是如何工作的,您将首先从一个二维数据集开始,该数据集有一个大的变化方向和一个较小的变化方向。在这部分练习中,您将看到使用PCA将数据从2D减少到1D时会发生什么。

data = loadmat(r'E:\Code\ML\ml_learning\ex7-kmeans and PCA\data\ex7data1.mat')
X = data['X']
# facecolors 设置为空心 edgecolors边缘颜色
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')

 

2.2 实现PCA

        在这部练习中,将实现PCA算法,主成分分析包括两个计算步骤计算数据的协方差矩阵,接着使用奇异值分解计算特征向量U1,U2,U3...Un,这些对应数据中变化的主成分。

        但是在使用PCA之前,重要的是先对数据集中的数据进行标准化,使它们处于相同范围中。

def featureNormalize(X):"""标准化"""means = X.mean(axis=0) # 按列stds = X.std(axis=0, ddof=1)X_norm = (X - means) / stdsreturn X_norm, means, stds

        在对数据标准后,可以使用PCA计算主成分,但是首先需要计算数据的协方差矩阵,公式如下。

\sum = \frac{1}{m}X^{T}X      

X是样本数据矩阵,m是样本个数,∑ 是一个n*n矩阵而非求和运算符。

        之后我们可以运用奇异值分解计算主成分,其中U包含主成分,每一列是我们数据要映射的向量,S包含对角矩阵,为奇异值。

[U, S, V] = svd(Sigma)

def pca(X):sigma = (X.T @ X) / len(X)U, S, V = np.linalg.svd(sigma)return U, S, V
X_norm, means, stds = featureNormalize(X)
U, S, V = pca(X_norm)# U = (array([[-0.70710678, -0.70710678],
#         [-0.70710678,  0.70710678]]),
# S = array([1.70081977, 0.25918023]),
# V =  array([[-0.70710678, -0.70710678],
#         [-0.70710678,  0.70710678]]))
plt.figure(figsize=(7, 5))
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')
plt.plot([means[0], means[0] + 1.5*S[0]*U[0,0]], [means[1], means[1] + 1.5*S[0]*U[0,1]],c='r', linewidth=3, label='First Principal Component')
plt.plot([means[0], means[0] + 1.5*S[1]*U[1,0]], [means[1], means[1] + 1.5*S[1]*U[1,1]],c='g', linewidth=3, label='Second Principal Component')
plt.grid()
plt.axis("equal")  
plt.legend()

        在画图部分的代码,其实自己也还是没有怎么弄懂的,由于数学功底不足对于奇异值分解这部分,还没有怎么弄明白,只是知道U,V两向量是对数据做映射变化,S是放缩倍数。 

2.3  PCA降维

        在计算主成分之后,可以使用它们来减少数据集的特征维数。

2.3.1 将数据投影在主成分上

def projectData(X, U, K):Z = X @ U[:,:K]return Z
Z = projectData(X_norm, U, 1)
# Z[0] = array([1.48127391])

2.3.2 重构数据

def recoverData(Z, U, K):X_rec = Z @ U[:,:K].Treturn X_rec
X_rec = recoverData(Z, U, 1)
plt.scatter(X_rec[:,0], X_rec[:,1], facecolors='none', edgecolors='b')

2.3.3 可视化

plt.figure(figsize=(7,5))
plt.axis("equal") 
# 绘制散点图
plot = plt.scatter(X_norm[:,0], X_norm[:,1], s=30, facecolors='none', edgecolors='b',label='Original Data Points')
plot = plt.scatter(X_rec[:,0], X_rec[:,1], s=30, facecolors='none', edgecolors='r',label='PCA Reduced Data Points')plt.title("Example Dataset: Reduced Dimension Points Shown",fontsize=14)
plt.xlabel('x1 [Feature Normalized]',fontsize=14)
plt.ylabel('x2 [Feature Normalized]',fontsize=14)
plt.grid(True)
# 加上连线
for x in range(X_norm.shape[0]):plt.plot([X_norm[x,0],X_rec[x,0]],[X_norm[x,1],X_rec[x,1]],'k--')# 输入第一项全是X坐标,第二项都是Y坐标
plt.legend()

2.4 人脸数据集

        在这部分练习中,将在人脸图像上运行PCA,以了解如何降维,首先先对数据可视化

data = loadmat(r'E:\Code\ML\ml_learning\ex7-kmeans and PCA\data\ex7faces.mat')
X = data['X']def displayData(X, row, col):"""可视化人脸"""fig, axs = plt.subplots(row, col, figsize=(8,8))for r in range(row):for c in range(col):axs[r][c].imshow(X[r*col + c].reshape(32,32).T, cmap = 'Greys_r')axs[r][c].set_xticks([])axs[r][c].set_yticks([])
displayData(X, 10, 10)

2.4.1 对人脸图像使用PCA

        为了在人脸数据集上运行PCA,我们首先通过从数据矩阵X中减去每个特征的平均值来规范化数据集。运行PCA后,将得到数据集的主成分。

X_norm, means, stds = featureNormalize(X)
U, S, V = pca(X_norm)
# 这里我们选取前36维
displayData(U[:,:36].T, 6, 6)

2.4.2 降维

        只将人脸数据集投射到前36个主成分上.

z = projectData(X_norm, U, K=36)
X_rec = recoverData(z, U, K=36)
displayData(X_rec, 10, 10)

参考文章 

吴恩达机器学习与深度学习作业目录 [图片已修复]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7649.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT辅导孩子作业有技巧

家长们&#xff0c;你是不是每天疲于奔命于工作和照顾孩子之间&#xff0c;还得抽空辅导孩子的作业&#xff1f;一边烦恼孩子作业多如牛毛&#xff0c;一边为自己的学习能力捉襟见肘&#xff1f;别担心&#xff0c;神秘的超级家长秘籍在此&#xff01;告别辅导孩子作业的痛苦&a…

百度地图api前端开发总结

1.this.map new BMapGL.Map(“mymap”); // 创建Map实例 2.this.map.centerAndZoom(new BMapGL.Point(116.404, 39.915), 5); // 初始化地图,设置中心点坐标和地图级别 3.this.map.enableScrollWheelZoom(true);//允许滚轮控制视口 4.var point new BMapGL.Point(116.404, 39…

全国各个省份市区县明细数据

全国总共有23个省、5个自治区、4个直辖市、2个特别行政区。 此数据包含省、市、区、县数据&#xff0c;共2886个。——更新于2023年6月10日 费了不少时间&#xff0c;暂时应该没有比我更全的了~~~细致到区县了 包括台湾省&#xff1a;台北市,新北市,桃园市,台中市,台南市,高…

【长白山旅游攻略】

《长白山旅游攻略》 一.游玩前的准备 1&#xff09;雪地冲锋衣羽绒服抓绒衫 2&#xff09;雪地冲锋裤抓绒裤 3&#xff09;厚围巾滑雪帽太阳镜手套&#xff0c;建议携带登山杖 4&#xff09;雪地登山鞋雪套 5&#xff09;高热零嘴白酒 6&#xff09;保湿面霜、唇膏 7&#xf…

白盒测试方法

一、白盒测试&#xff1a;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。 二、举例说明 1、逻辑覆盖法&#xff1a;是通过对程序逻辑结构的遍历实现程序的覆盖。 步骤一&#xff1a;通过程序逻辑结构画出流程图 步骤二&#xff1a;分析出哪些条件走哪些语句块 …

家乡的山-良岗山

戴云山东南延伸有余脉入漳&#xff0c;即为家乡长泰境内的邑山之首——良岗山。良岗山不仅巍峨雄伟&#xff0c;资源丰盛&#xff0c;而且历史悠久&#xff0c;人文景观众多&#xff0c;更以良岗圣王信仰泽被海峡两岸&#xff0c;蕴涵着两岸人民手足情深、血浓于水&#xff0c;…

白盒测试与黑盒测试

白盒测试技术 白盒测试技术也称结构性测试&#xff0c;是一种设计测试用例的方法&#xff0c;一般用于分析程序的内部结构&#xff0c;使用该方法测试程序时测试者可以看到被测试程序&#xff0c;并分析其内部结构。 按照被测试测试时是否需要执行测试程序可以分为静态和动态…

[JSON]2017年最新县及县以上行政区划代码

前面有过两篇相关的博客&#xff1a; 中国行政区划代码数据库文件 - 最新县及县以上行政区划代码&#xff08;截止2012年10月31日&#xff09;[数据][xml格式] 2012年统计用区划代码和城乡划分代码 一个是SQL文件&#xff0c;一个是XML文件&#xff0c;并且城乡的涉及抓取数据…

chatGPT大大提高了编程效率

可以预见的是&#xff0c;未来对初级程序员的需求大大减少了。chatGPT的编程能力已经非常高&#xff0c;程序员一定要善于在工作中使用它&#xff0c;绝对是提高生产力的利器。 下面是我为了生成一些测试数据&#xff0c;让chatGPT帮我编写的程序&#xff0c;由于我对shell了解…

首个ChatGPT开发的应用上线;ChatMind思维导图工具;中文提示词大全;Copilot平替 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『一本与众不同的AI绘本』ChatGPT 编写故事 Midjourney 绘制插图 作者的女儿特别喜欢迪士尼动画《海洋奇缘》里的主人公莫阿娜&#…

简历丢给chatGPT,他问了我这些问题

chatGPT返回的问题 根据我的简历他问了我以下几个问题&#xff1a; 面试官&#xff1a;尊敬的面试者&#xff0c;您的简历显示您具备丰富的前端开发经验&#xff0c;我们非常高兴能邀请您来参加面试。现在让我们开始探讨一些与您工作经历和技能相关的问题&#xff0c;期待您的…

我把我的简历丢给chatGPT,他问了我这些问题

前言 chatGPT是openAI于2022年11月推出的人工智能聊天程序&#xff0c;chatGTP一经推出便火爆全网&#xff0c;通过一问一答且结合上下文的方式自动生成问题答案&#xff0c;作为前端开发工程师&#xff0c;我们可以使用chatGTP进行代码纠错&#xff0c;代码优化等一系列的代码…

一文带你学会如何写一份糟糕透顶的简历

我们每个人几乎都会面对找工作这件事&#xff0c;而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比&#xff0c;糟糕透顶的求职简历&#xff0c;说实话&#xff0c;其实几年前&#xff0c;我就是这么写的。 目录 1. 文件名 2. 基本信…

程序化广告(5):广告投放

本系列文章是对《程序化广告 - 个性化精准投放实用手册》一书的简单总结&#xff0c;整理了书中重要的知识点和概念&#xff0c;希望能有助于理解互联网广告业务。 主要分为6个章节&#xff08;点击前往&#xff09;&#xff1a; 概述参与者交易模式考核指标广告投放&#xff0…

神策广告投放(用户行为)分析经验总结

神策广告投放(用户行为)分析 为什么要进行用户行为分析(用户运营) ​ 注意&#xff1a;神策的数据结构是user event&#xff08;用户事件结构&#xff09;&#xff0c;该结构的核心点就是event&#xff08;用户行为事件&#xff09;&#xff0c;神策都是以用户触发某个行为进…

ChatGPT实火,这小东西牛在哪?

ChatGPT&#xff0c;真的火了啊&#xff01; 相信许多朋友都听说过 ChatGPT铺天盖地的赞美&#xff0c;但并不清楚它是个啥。 体制内让ChatGPT写材料&#xff0c;广告行业让ChatGPT写策划案&#xff0c;媒体让ChatGPT写新闻稿&#xff0c;程序员让ChatGPT写代码甚至还带修BUG服…

强大的ChatGpt为企业营销推广提供了全方位的加持

chatgpt&#xff0c;一个火出圈的“聊天机器人”。从写作文&#xff0c;到写代码&#xff0c;似乎没有什么是它干不了的。 ChatGpt在工业中的应用场景有哪些? 在工业领域&#xff0c;它可以用于提高生产效率&#xff0c;缩短生产周期&#xff0c;并帮助工人解决生产过程中的问…

ChatGPT性能暴降!OpenAI重磅回应!

最近&#xff0c;ChatGPT Plus 的用户一直反映该平台及其底层 LLM (GPT-4) 的性能严重下降&#xff08;编程准确率也暴降13%&#xff09;。 这是继最近一系列更新之后的结果&#xff0c;包括为 Plus 订阅者提供网络浏览和扩展插件访问权限。在这些更新之后&#xff0c;该服务的…

C#/.Net开发chatGPT、openAI

C#/.Net开发chatGPT、openAI 最近ChatGPT火爆了&#xff0c;自己使用了一下&#xff0c;确实厉害。但是使用官方网站不支持国内访问&#xff0c;好在国内可以使用API调用&#xff0c;所以自己折腾一番&#xff0c;使用C#来调用API。 获取Token 注册账号获取api-keys等操作可…

ChatGPT 人工智能革命从实验室走入公众生活

11 月底&#xff0c;人工智能研究实验室OpenAI 发布了 ChatGPT 聊天机器人首个测试版本&#xff0c;这是一款基于人工智能的新型聊天机器人&#xff0c;可以与人类进行对话&#xff0c;经过测试后&#xff0c;新款机器人便踏上了社交网站之旅&#xff0c;尤其是在推特平台上&am…