異構圖上的連接預測一

這里寫目錄標題

  • 異構圖?
  • 處理數據:

異構圖?

異構圖:就是指節點與邊類型不同的圖。
連接預測:目的是預測圖中兩個節點之間是否存在一條邊,或者是預測兩個節點之間,在未來可能形成的連接。
eg:
節點:
研究人員A、研究人員B、研究人員C
論文P1、論文P2
機構I1
邊關系:
研究人員A 寫作 論文P1
研究人員B 寫作 論文P1
研究人員C 寫作 論文P2
論文P1 隸屬于 機構I1
例如呢,我們想預測 在未來 A 與B 是否會合作寫作論文呢?
或者是預測 B會不會加入機構l1呢?

處理數據:

代碼展示,其中包括我其中遇到的困惑。

"""
MoviesLens數據集:描述了MoviesLens的評分以及標記活動。
該數據集包括600多個用戶對9000多部電影的10萬個評分。
使用該數據集生成兩種節點類型: 分別保存電影  和 用戶的數據,
以及一種連接用戶和電影的邊緣類型,表示用戶是否對特定電影進行了評級關系。
最后,鏈接預測任務 嘗試預測缺失的評分,可以用于向用戶推薦新電影。"""import torch
import os
import pandas as pd
from torch_geometric.data import HeteroData
import torch_geometric.transforms as T
# 電影
movies_path = './data/ml-latest-small/movies.csv'
# 評分
ratings_path = './data/ml-latest-small/ratings.csv'# 在處理數據之前肯定得先知道csv中的數據格式
# print('movies.csv')
# print('movies.csv:')
# print('===========')
# print(pd.read_csv(movies_path)[["movieId", "genres"]].head(10))
# print()
# print('ratings.csv:')
# print('============')
# print(pd.read_csv(ratings_path)[["userId", "movieId"]].head(10))# 加載數據,movieId 作為索引列
movies_df = pd.read_csv(movies_path,index_col='movieId')
# data = {
#     'movieId': [1, 2, 3],
#     'title': ['Toy Story', 'Jumanji', 'Grumpier Old Men'],
#     'genres': ['Adventure|Animation|Children|Comedy|Fantasy',
#                'Adventure|Children|Fantasy',
#                'Comedy|Romance']
# }
# 執行下方這行代碼,作用就是按照 | 進行分割,且使用one-hot 編碼
# 輸出:   Adventure  Animation  Children  Comedy  Fantasy  Romance
# 0          1          1         1       1        1        0
# 1          1          0         1       0        1        0
# 2          0          0         0       1        0        1
genres = movies_df['genres'].str.get_dummies('|')
# print(genres[["Action", "Adventure", "Drama", "Horror"]].head())
# (9742, 20) 9742部電影,20種體裁
# print(genres.values.shape)
# 將genres作為電影的輸入特征
movie_feat = torch.from_numpy(genres.values).to(torch.float)
assert movie_feat.size() == (9742,20)# 同理對評分進行處理
ratings_df = pd.read_csv(ratings_path)# 提取出每個用戶的id
"""
ratings_data = {'userId': [10, 20, 10, 30, 20, 40, 30, 50],'movieId': [101, 101, 102, 103, 104, 105, 106, 107],'rating': [3.5, 4.0, 2.5, 5.0, 4.0, 3.0, 4.5, 2.0]
}
"""
# unique_user_id = ([10, 20, 30, 40, 50])
unique_user_id = ratings_df['userId'].unique()
# 創建映射表
"""userId  mappedID
0      10         0
1      20         1
2      30         2
3      40         3
4      50         4
"""
unique_user_id = pd.DataFrame(data={'userId': unique_user_id,'mappedID':pd.RangeIndex(len(unique_user_id))
})# 同理,對電影進行相同處理
unique_movie_id = ratings_df['movieId'].unique()
unique_movie_id = pd.DataFrame(data={'movieId':unique_movie_id,'mappedID':pd.RangeIndex(len(unique_movie_id))
})# 獲取user和movie的原始Id和映射ID
# 下方這代碼,不就是將評分表種的原始id與獲取的映射id進行映射而已嗎
ratings_user_id = pd.merge(ratings_df['userId'],unique_user_id,left_on='userId',right_on='userId',how='left')
ratings_user_id = torch.from_numpy(ratings_user_id['mappedID'].values)ratings_movie_id = pd.merge(ratings_df['movieId'], unique_movie_id,left_on='movieId', right_on='movieId', how='left')
ratings_movie_id = torch.from_numpy(ratings_movie_id['mappedID'].values)# 構造’edge_index'
# 在這里,你肯定會有這個疑惑?
# 為啥能那么剛好,例如用戶id為0的,剛好就是評論10號電影呢?
# 其實在一開始,所有的數據都是安排好的
#  'userId': [1, 2, 1, 3, 2, 4, 3, 5],
#    'movieId': [101, 101, 102, 103, 104, 105, 106, 107],
#    'rating': [3.5, 4.0, 2.5, 5.0, 4.0, 3.0, 4.5, 2.0]
# 是不是一一對應呢?只是將userid和movieid轉變為對應的mappedid而已
# 例如:userid:[0, 1, 0, 2, 1, 3, 2, 4]
#      movieid:[0, 0, 1, 2, 3, 4, 5, 6]
edge_index_user_to_movie = torch.stack([ratings_user_id,ratings_movie_id],dim=0)
assert edge_index_user_to_movie.size() == (2,100836)
"""
tensor([[   0,    0,    0,  ...,  609,  609,  609],[   0,    1,    2,  ..., 3121, 1392, 2873]])
"""
# print(edge_index_user_to_movie)# 到現在,完成了數據的處理
# 初始化HeterData 對象。
data = HeteroData()# 保存節點索引
data['user'].node_id = torch.arange(len(unique_user_id))
data['movie'].node_id = torch.arange(len(movies_df))# 添加節點特征和邊索引
data['movie'].x = movie_feat  # 電影的體裁作為節點特征,因為每個電影可能會有多個體裁
data['user','rates','movie'].edge_index =edge_index_user_to_movie# 添加反向邊,使得GNN能夠在兩個方向上傳遞消息,那不就是成為無向圖咯
data = T.ToUndirected()(data)print(data)
assert data.node_types == ["user", "movie"]
assert data.edge_types == [("user", "rates", "movie"),("movie", "rev_rates", "user")]assert data["user"].num_nodes == 610
assert data["user"].num_features == 0
assert data["movie"].num_nodes == 9742
assert data["movie"].num_features == 20assert data["user", "rates", "movie"].num_edges == 100836
assert data["movie", "rev_rates", "user"].num_edges == 100836

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16130.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統如何通過編譯方式安裝python3.11.3

1.切換到/data 目錄 cd /data 2.下載python源碼Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安裝路徑 和 執行openssl的路徑 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基(三) 一、final概念1、案例1:采用繼承:2、案例2:final修飾的類不可以被繼承:3、案例3:final修飾的類不能有子類,但是可以有父類4、final修飾構造方法5、final修飾普通方法6、…

頭歌GCC編程工具集第1關:實驗工具GCC與objdump的使用

任務要求 根據提示,在右側編輯器中顯示的bytes.c文件中的 Begin-End 之間補充代碼(即設置一個數組的初始值),使其與如下顯示的main.c文件一起編譯、生成的程序在運行時輸出“SUCCESS”。 程序源文件main.c的內容如下(務…

牛客前端面試高頻八股總結(1)(附文檔)

1.html語義化 要求使用具有語義的標簽:header footer article aside section nav 三點好處: (1)提高代碼可讀性,頁面內容結構化,更清晰 (2)無css時,時頁面呈現出良好…

滲透工具CobaltStrike工具的下載和安裝

一、CobalStrike簡介 Cobalt Strike(簡稱為CS)是一款基于java的滲透測試工具,專業的團隊作戰的滲透測試工具。CS使用了C/S架構,它分為客戶端(Client)和服務端(Server),服務端只要一個,客戶端可有多個,多人連接服務端后…

Golang設計模式(四):觀察者模式

觀察者模式 什么是觀察者 觀察者模式(Observer Pattern):定義對象之間的一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知并被自動更新。觀察者模式的別名包括發布-訂閱(Publish/Subscribe&#xf…

音視頻開發8 音視頻中SDL的使用,SDL 在windows上環境搭建,SDL 使用 以及 常用 API說明,show YUV and play PCM

1.SDL簡介 SDL(Simple DirectMedia Layer),是一個跨平臺的C語言多媒體開發庫。 支持Windows、Mac OS X、Linux、iOS、Android 提供對音頻、鍵盤、鼠標、游戲操縱桿、圖形硬件的底層訪問 很多的視頻播放軟件、模擬器、受歡迎的游戲都在使用…

面試中算法(A星尋路算法)

一、問題需求: 迷宮尋路游戲中,有一些小怪物要攻擊主角,現在希望你給這些小怪物加上聰 明的AI (Artificial Intelligence,人工智能),讓它們可以自動繞過迷宮中的障礙物,尋找到主角的所在。 A星…

json web token及JWT學習與探索

JSON Web Token(縮寫 JWT)是目前最流行的跨域認證解決方案 作用: 主要是做鑒權用的登錄之后存儲用戶信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

Django使用fetch實現登錄

Django使用session管理(cookie)實現了一個用戶登錄和會話保持功能。如果需求不太復雜可以使用Django默認的登錄功能。 1 安裝django-cors-headers 首先需要安裝django-cors-headers pip install django-cors-headers2 在settings中配置 需要按照djan…

用Dockerfile和Shell腳本來部署一個Go項目

如何使用Dockerfile和Shell腳本來部署一個Go項目。這種方法能夠幫助我們自動化構建、測試和部署流程,提高開發效率。 **一、項目結構和代碼** 首先,我們需要準備一個Go項目。假設我們的項目結構如下: my-go-app/ ├── main.go ├── D…

1107 老鼠愛大米

solution 記錄每組的最大值&#xff0c;并比較組間的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介紹與基本用法

創作不易&#xff0c;本篇文章如果幫助到了你&#xff0c;還請點贊 關注支持一下?>&#x16966;<)!! 主頁專欄有更多知識&#xff0c;如有疑問歡迎大家指正討論&#xff0c;共同進步&#xff01; &#x1f525;c系列專欄&#xff1a;C/C零基礎到精通 &#x1f525; 給大…

第三周:從錯誤中認識到管理

1. 約定兩周時間&#xff0c;完成這個功能 在管理者分配好項目任務后&#xff0c;只是口頭約定兩周的時間&#xff0c;沒有形成需求文檔。對于需求&#xff0c;人與人的理解是不一樣的&#xff0c;有些太過于抽象的東西&#xff0c;太難以描繪&#xff0c;只能一而再再而三的確…

【論文復現】LSTM長短記憶網絡

LSTM 前言網絡架構總線遺忘門記憶門記憶細胞輸出門 模型定義單個LSTM神經元的定義LSTM層內結構的定義 模型訓練模型評估代碼細節LSTM層單元的首尾的處理配置Tensorflow的GPU版本 前言 LSTM作為經典模型&#xff0c;可以用來做語言模型&#xff0c;實現類似于語言模型的功能&am…

vue3的proxy如何取代object和defineproperty

在 Vue 2.x 中&#xff0c;為了響應式地追蹤對象屬性的變化&#xff0c;Vue 使用了 Object.defineProperty 方法。但是&#xff0c;Object.defineProperty 有一些限制&#xff0c;比如它不能追蹤屬性的添加或刪除&#xff0c;也不能直接用于數組或對象原型鏈上的屬性。 Vue 3.…

【Torch學習筆記】

作者&#xff1a;zjk 和 的區別是逐元素相乘&#xff0c;是矩陣相乘 cat stack 的區別 cat stack 是用于沿新維度將多個張量堆疊在一起的函數。它要求所有輸入張量具有相同的形狀&#xff0c;并在指定的新維度上進行堆疊。

【NumPy】關于numpy.mean()函數,看這一篇文章就夠了

&#x1f9d1; 博主簡介&#xff1a;阿里巴巴嵌入式技術專家&#xff0c;深耕嵌入式人工智能領域&#xff0c;具備多年的嵌入式硬件產品研發管理經驗。 &#x1f4d2; 博客介紹&#xff1a;分享嵌入式開發領域的相關知識、經驗、思考和感悟&#xff0c;歡迎關注。提供嵌入式方向…

Android11熱點啟動和關閉

Android官方關于Wi-Fi Hotspot (Soft AP) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager類中有一套系統 API 可以控制熱點的開和關&#xff0c;代碼如下&#xff1a; 開啟熱點&#xff1a; // SoftApC…

Vue 父組件使用refs來直接訪問和修改子組件的屬性或調用子組件的方法

步驟 1: 在子組件中定義要被修改的屬性或方法 首先&#xff0c;在子組件中定義你想要父組件能夠修改或調用的屬性或方法。例如&#xff0c;我們有一個名為MyChildComponent的子組件&#xff0c;它有一個名為childData的數據屬性和一個名為updateData的方法。 // 子組件 MyChi…