日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python3源码剖析_T-SNE源码剖析(python版)

發(fā)布時間:2025/3/15 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3源码剖析_T-SNE源码剖析(python版) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)

#返回任意兩個點(diǎn)之間距離的平方

return dist

# 計算困惑度,最終會選擇合適的beta,也就是每個點(diǎn)的方差啦

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

# '''計算perplexity, D是距離向量,

# idx指dist中自己與自己距離的位置,beta是高斯分布參數(shù)

# 這里的perp僅計算了熵,方便計算

# '''

prob = np.exp(-dist * beta)

# 設(shè)置自身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

# '''

# 初始化參數(shù)

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,方便后續(xù)計算

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]需要換不能是所有點(diǎn)

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)))

#每個點(diǎn)對其他點(diǎn)的條件概率分布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

# 隨機(jī)初始化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()

總結(jié)

以上是生活随笔為你收集整理的python3源码剖析_T-SNE源码剖析(python版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女自拍偷拍 | 91av入口| 多男调教一女折磨高潮高h 国内毛片毛片毛片毛片毛片 | 草草影院欧美 | 久久无码人妻丰满熟妇区毛片 | 四虎影视在线 | 中文字幕在线永久 | 免费的黄色av | 五月婷婷国产 | 日韩精品人妻一区二区三区免费 | 综合久久中文字幕 | 日本中文字幕在线看 | 日韩少妇内射免费播放18禁裸乳 | 国产欧美一级片 | 福利在线免费 | 亚洲乱码电影 | 一级片少妇 | 国产无遮挡又黄又爽 | 免费中文字幕视频 | 涩涩的视频在线观看 | 亚洲在线观看一区二区 | 亚洲综合免费观看高清完整版在线 | 操操操干干干 | 久久福利片 | 国产一区二区三区在线视频 | 特黄一级视频 | 黄色大全免费看 | 老司机精品视频在线 | 国产字幕在线观看 | 欧美操穴视频 | 韩国激情呻吟揉捏胸视频 | 偷拍精品一区二区三区 | 蜜臀精品一区二区三区 | 2021天天干 | 精品人妻一区二区三区视频 | 伊人伊人伊人伊人 | 福利在线小视频 | 精品久久免费视频 | 黄色片网站在线看 | 久久艹在线观看 | 久久国产视频播放 | 我爱av好色 | 亚洲天堂免费在线 | www免费黄色 | 亚洲精品成人 | 新版红楼梦在线高清免费观看 | 秋霞欧美一区二区三区视频免费 | 中文字幕在线播放av | 亚洲天堂岛 | 99色亚洲| 91国偷自产一区二区三区观看 | 天天艹日日艹 | 99爱在线| 国产成人精品一区二区三区免费 | 伊人55 | 国产精品资源网 | 伊人99 | 国产又粗又猛又爽69xx | 综合网五月 | 日韩成人在线一区 | 国产精品福利小视频 | 日韩福利在线观看 | 亚洲成av人片在线观看无码 | 全黄一级裸体 | 99er久久 | 自拍偷拍亚洲图片 | 青青草娱乐视频 | 久久久久久久久久国产 | 久久免费av| 国精产品一区二区 | 欧美午夜精品久久久久久孕妇 | 伦理av在线 | 在线视频 日韩 | 国产一区二区在线观看视频 | 国产一二在线观看 | 亚洲欧美日韩精品久久 | 国产精品成人免费一区久久羞羞 | 亚洲射吧| 欧美性爱视频久久 | 色婷婷一区二区三区四区 | 黄色网址在线免费 | 午夜剧场成人 | 日韩免费专区 | 亚洲va欧美va国产综合久久 | 超碰这里只有精品 | 亚洲精品乱码久久 | 6090伦理| 亚洲精品无码不卡在线播he | 成人一级片 | 第一章豪妇荡乳黄淑珍 | 国产精品免费91 | 大尺度做爰呻吟舌吻情头 | 成人黄色片视频 | 极品五月天 | 天天综合天天做天天综合 | 色图av| 久久综合九色综合网站 | 精品欧美一区二区三区 | 欧美一a一片一级一片 |