import numpy as np

import matplotlib.pyplot as plt

# 输入为(n*m)的矩阵,表示n个样本,m个属性

# 返回一个距离矩阵

def cal_pairwise_dist(x):

# '''计算pairwise 距离, x是matrix

# (a-b)^2 = a^2 + b^2 - 2*a*b

# '''

sum_x = np.sum(np.square(x), 1)

# print -2 * np.dot(x, x.T)

# print np.add(-2 * np.dot(x, x.T), sum_x).T

dist = np.add(np.add(-2 * np.dot(x, x.T), sum_x).T, sum_x)

#返回任意两个点之间距离的平方

return dist

# 计算困惑度,最终会选择合适的beta,也就是每个点的方差啦

def cal_perplexity(dist, idx=0, beta=1.0):

# '''计算perplexity, D是距离向量,

# idx指dist中自己与自己距离的位置,beta是高斯分布参数

# 这里的perp仅计算了熵,方便计算

# '''

prob = np.exp(-dist * beta)

# 设置自身prob为0

prob[idx] = 0

sum_prob = np.sum(prob)

if sum_prob == 0:

prob = np.maximum(prob, 1e-12)

perp = -12

else:

prob /= sum_prob

perp = 0

for pj in prob:

if pj != 0:

perp += -pj*np.log(pj)

# 困惑度和pi\j的概率分布

return perp, prob

def seach_prob(x, tol=1e-5, perplexity=30.0):

# '''二分搜索寻找beta,并计算pairwise的prob

# '''

# 初始化参数

print("Computing pairwise distances...")

(n, d) = x.shape

dist = cal_pairwise_dist(x)

pair_prob = np.zeros((n, n))

beta = np.ones((n, 1))

# 取log,方便后续计算

base_perp = np.log(perplexity)

for i in range(n):

if i % 500 == 0:

print("Computing pair_prob for point%sof%s..." %(i,n))

betamin = -np.inf

betamax = np.inf

#dist[i]需要换不能是所有点

perp, this_prob = cal_perplexity(dist[i], i, beta[i])

# 二分搜索,寻找最佳sigma下的prob

perp_diff = perp - base_perp

tries = 0

while np.abs(perp_diff) > tol and tries < 50:

if perp_diff > 0:

betamin = beta[i].copy()

if betamax == np.inf or betamax == -np.inf:

beta[i] = beta[i] * 2

else:

beta[i] = (beta[i] + betamax) / 2

else:

betamax = beta[i].copy()

if betamin == np.inf or betamin == -np.inf:

beta[i] = beta[i] / 2

else:

beta[i] = (beta[i] + betamin) / 2

# 更新perb,prob值

perp, this_prob = cal_perplexity(dist[i], i, beta[i])

perp_diff = perp - base_perp

tries = tries + 1

# 记录prob值

pair_prob[i,] = this_prob

print("Mean value of sigma: ", np.mean(np.sqrt(1 / beta)))

#每个点对其他点的条件概率分布pi\j

return pair_prob

def tsne(x, no_dims=2, initial_dims=50, perplexity=30.0, max_iter=800):

"""Runs t-SNE on the dataset in the NxD array xto reduce its dimensionality to no_dims dimensions.The syntaxis of the function is Y = tsne.tsne(x, no_dims, perplexity),where x is an NxD NumPy array."""

# Check inputs

if isinstance(no_dims, float):

print("Error: array x should have type float.")

return -1

if round(no_dims) != no_dims:

print("Error: number of dimensions should be an integer.")

return -1

(n, d) = x.shape

print (x.shape)

#动量

eta = 500

# 随机初始化Y

y = np.random.randn(n, no_dims)

# dy梯度

dy = np.zeros((n, no_dims))

# 对称化

P = seach_prob(x, 1e-5, perplexity)

P = P + np.transpose(P)

P = P / np.sum(P) #pij

# early exaggeration

# pi\j

P = P * 4

P = np.maximum(P, 1e-12)

# Run iterations

for iter in range(max_iter):

# Compute pairwise affinities

sum_y = np.sum(np.square(y), 1)

num = 1 / (1 + np.add(np.add(-2 * np.dot(y, y.T), sum_y).T, sum_y))

num[range(n), range(n)] = 0

Q = num / np.sum(num) #qij

Q = np.maximum(Q, 1e-12) #X与Y逐位比较取其大者

# Compute gradient

#pij-qij

PQ = P - Q

#梯度dy

for i in range(n):

dy[i,:] = np.sum(np.tile(PQ[:,i] * num[:,i], (no_dims, 1)).T * (y[i,:] - y), 0)

# 更新y

y = y - eta*dy

# 减去均值

y = y - np.tile(np.mean(y, 0), (n, 1))

# Compute current value of cost function

if (iter + 1) % 50 == 0:

if iter > 100:

C = np.sum(P * np.log(P / Q))

else:

C = np.sum( P/4 * np.log( P/4 / Q))

print("Iteration ", (iter + 1), ": error is ", C)

# Stop lying about P-values

if iter == 100:

P = P / 4

print("finished training!")

return y

if __name__ == "__main__":

print("Run Y = tsne.tsne(X, no_dims, perplexity) to perform t-SNE on your dataset.")

print("Running example on 2,500 MNIST digits...")

X = np.loadtxt("mnist2500_X.txt")

labels = np.loadtxt("mnist2500_labels.txt")

Y = tsne(X, 2, 50, 20.0)

plt.scatter(Y[:, 0], Y[:, 1], 20, labels)

plt.show()

python3源码剖析_T-SNE源码剖析(python版)相关推荐

  1. python 吾爱破解_吾爱破解邀请码获取器|吾爱优惠码生成器 Python版_最火软件站...

    吾爱破解论坛是一个非常棒的资源交流论坛,里面有很多大神分享非常实用的各种工具,而且都是免费的,但是注册吾爱破解论坛需要邀请码,这款工具能够帮助用户生成常见的优惠码和激活码,让你轻松加入吾爱论坛的阵营. ...

  2. 【Java集合源码剖析】Hashtable源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元 ...

  3. spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析

    spark 源码分析之八--Spark RPC剖析之TransportContext和TransportClientFactory剖析 TransportContext 首先官方文档对Transpor ...

  4. 深入剖析Spring Web源码(十九) - 整理的文档和日志的索引(第一版)

    整理的文档 把所有的<深入剖析Spring Web>系列日志整理成为文档,供大家下载阅读,希望对大家有所帮助.里面有些章节尚未完成,所以称为第一版.希望不久的将来,能把没有完成的章节在第二 ...

  5. Ubuntu14.04安装openssl,python3.7,下载清华源的AOSP安卓6源码

    Ubuntu14.04安装openssl,python3.7,下载清华源的AOSP安卓6源码 升级安装python3.7 带有openssl **先安装需要的包zlib1g,libffi**sudo ...

  6. 【Java集合源码剖析】HashMap源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票,谢 ...

  7. 智能多轮对话机器人案例剖析(附源码)-张子良-专题视频课程

    智能多轮对话机器人案例剖析(附源码)-269人已学习 课程介绍         智能多轮对话机器人案例剖析(附源码) 三个完整案例,体验式教学: 一套开源框架,所学即所用: 课程收益     掌握任务 ...

  8. 【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)

    承接[[深度挖掘 RocketMQ底层源码]「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)] pullBlockIfNotFound方法 通过该方法获取 ...

  9. 收款码在线生成系统源码 无限制

    截图 收款码在线生成系统源码 无限制 说明 之后用过两个收款码生成系统,一个是收款啦,还有一个是优启梦收款码,前面一个用起来挺方便的,就是二维码识别得比较慢,自己想改接口但是没学过php也做不了什么. ...

  10. python防止源码泄露_ctf常见源码泄露 - Lmg66 - 博客园

    前言 在ctf中发现很多源码泄露的题,总结一下,对于网站的搭建要注意删除备份文件,和一些工具的使用如git,svn等等的规范使用,避免备份文件出现在公网 SVN源码泄露 原理 SVN(subversi ...

最新文章

  1. 【Ubuntu】在Ubuntu中设置永久的DNS
  2. R语言dplyr包获取dataframe分组聚合的最大值实战(Maximum Value by Group)
  3. 剪切粘贴时总是上次的内容_macOS系统上面如何实现Windows上的“剪切”功能
  4. 原创:Docker在云家政的应用 谢绝复制粘贴内容
  5. 【独家】手环新玩法,北京一卡通推出“刷刷手环”每天5000步每月返10元
  6. hdu 2049 不容易系列之(4)——考新郎
  7. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用
  8. 零基础学Python(第十九章 File操作·IO流补充章节)
  9. MVC + AJAX请求失败的问题
  10. linux 改目录前缀,Linux修改终端显示前缀及环境变量
  11. kendotabstrip 动态加tab_加你的好友这么多,为什么偏偏记不住我这名微商?
  12. 微商模式的出路在哪里?
  13. makefile中常用函数
  14. 计算机科学区别于数学和物理学,新编大学计算机基础
  15. ALS算法(推荐系统)
  16. ubuntu 16.04极速安装ROS-Kinetic,以及常见错误处理
  17. sql自动生成汉语拼音和首字母函数[转载]
  18. Pinterest模式:互联网新一轮热潮来临
  19. Ubuntu 16.04无损分区大小调整工具Gparted
  20. 概率与期望——P1365 WJMZBMR打osu! / Easy

热门文章

  1. Qt修炼手册8_常用的容器类QVector和QList
  2. 用sql从文件中恢复数据库
  3. JZ2440学习总结1
  4. 实验二 二叉树的操作与实现
  5. BUUCTF-Reverse:reverse1
  6. jsp设置背景图片并使得图片扩大到整个屏幕
  7. DOS调用21H存取中断向量
  8. C语言实现通用链表初步(二)
  9. C语言再学习 -- 常用头文件和函数(转)
  10. java文件名特殊字符_Java 8:用名字读取特殊字符的文件