主頁 > 後端開發 > Task02sklearn邏輯回歸Demo_機器學習訓練營_阿里云天池

Task02sklearn邏輯回歸Demo_機器學習訓練營_阿里云天池

2020-12-18 11:33:53 後端開發

Task02 sklearn邏輯回歸Demo

一、學習內容概括

通過一個小例子,掌握邏輯回歸的sklearn函式呼叫使用,

學習地址、參考資料:

1.阿里云天池-AI訓練營機器學習:https://tianchi.aliyun.com/specials/promotion/aicampml?invite_channel=1&accounttraceid=7df048c2ce194081b514fd2c8e9a3f00cqmm

2.Sklearn中文檔案:http://www.scikitlearn.com.cn/

3.Matplotlib.pyplot:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot

4.Numpy手冊:https://numpy.org/doc/stable/index.html

二、具體學習內容

1 庫函式匯入

## 基礎函式庫
import numpy as np 

## 匯入畫圖庫
import matplotlib.pyplot as plt
import seaborn as sns

## 匯入邏輯回歸模型函式
from sklearn.linear_model import LogisticRegression

scikit-learn 是一個開源的機器學習庫,它支持監督學習和無監督學習,它還提供了用于模型擬合,資料預處理,模型選擇和評估以及許多其他實用程式的各種工具,

監督學習下有很多線性模型,邏輯回歸就是一種,該模型利用邏輯函式將單次試驗的可能結果輸出為概率,用來解決分類問題,scikit-learn 中邏輯回歸在LogisticRegression類中實作了二分類(binary)、一對多分類(one-vs-rest)及多項式 logistic 回歸,并帶有可選的 L1 和 L2 正則化,scikit-learn的邏輯回歸在默認情況下使用L2正則化,

2 模型訓練

## Demo演示LogisticRegression分類

## 構造資料集
x_features = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])#6x2
y_label = np.array([0, 0, 0, 1, 1, 1])

## 呼叫邏輯回歸模型
lr_clf = LogisticRegression()

## 用邏輯回歸模型擬合構造的資料集
lr_clf = lr_clf.fit(x_features, y_label) 

因為本次訓練只是一個小練習,所以不需要加載一些標準資料集,自己構建一個簡單的資料集就行了,輸入變數x_features是6x2的矩陣,標記資訊y_label是兩個離散值0、1,意思是我們訓練這6個樣本,分成2類分別是0和1,擬合出一個估計器(在這里就是一個訓練好的邏輯回歸模型),再用這估計器去預測未知樣本所屬的類別,

在sklearn中,分類的估計器是一個python物件,因為都封裝好了,所以我們把估計器當成一個黑箱去操作就行了,我們先呼叫邏輯回歸模型把估計器實體化并命名為lr_clf ,lr_clf呼叫fit方法,輸入是訓練集,以此來擬合資料完成學習,把習得的估計器更新給lr_clf,

3 模型引數查看

## 其擬合方程為 y=w0+w1*x1+w2*x2
## 查看其對應模型的w
print('the weight of Logistic Regression:',lr_clf.coef_)

## 查看其對應模型的w0
print('the intercept(w0) of Logistic Regression:',lr_clf.intercept_)
運行結果:
the weight of Logistic Regression: [[0.73455784 0.69539712]]
the intercept(w0) of Logistic Regression: [-0.13139986]

sklearn線性模型中,目標值y是輸入變數x的線性組合,如果\hat{y}是預測值,那有:\hat{y}(w,x)=w_{0}+w_{1}x+...w_{p}x,在整個模塊中定義向量 w=(w_{1},...,w_{p})作為coef_,定義 w_{0}作為intercept_,我們的輸入變數x_features是6x2的矩陣,表示我們有6個樣本,每個樣本都有2個屬性,所以我們的假設函式有2個未知項x1、x2,2個引數w1、w2:h(x)=w0+w1*x1+w2*x2

4 資料和模型可視化

4.1 可視化構造的資料樣本點

## 可視化構造的資料樣本點
plt.figure()
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()

4.1.1 scatter()函式:繪制散點圖

matplotlib.pyplot.scatter:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter

相關代碼:plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')

語法:matplotlib.pyplot.scatter(x,y,c = None,s = None,cmap = None,...)

x,y表示平面點的位置,可以用陣列形式表示,x表示點的橫坐標,y表示對應點的縱坐標,x_features[:,0] 是array([-1, -2, -3, 1, 2, 3]),x_features[:,1] 是array([-2, -1, -2, 3, 1, 2]),

c表示每一個點的顏色的標記值,可以用陣列形式表示,這里c并不是設定點的顏色,只是會給這個點分配一個標記值,可搭配其他項一起使用,比如cmap項可以把顏色的指示值映射到具體顏色上去,這里c=y_label=array([0, 0, 0, 1, 1, 1]),表示對應的前三個點是一種顏色,后三個點是一種顏色,如果不設定c值,默認所有點是一個顏色,

s表示點大小,

cmap設定點的顏色,可以用注冊的顏色表名表示,注意僅當c是浮點數陣列時才使用cmap,默認值就是viridis(matplotlib.pyplot.viridis)所以本條代碼去掉cmap也會得到一樣的顏色,可以改成其他值如summer、winter、hot、cool試試效果,更多的顏色:https://matplotlib.org/examples/color/colormaps_reference.html,

4.2 可視化決策邊界

# 可視化決策邊界
plt.figure()
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')

nx, ny = 200, 100
#獲取當前軸的極限,如x軸:left, right = plt.xlim()
#x_min = -3,3, x_max = 3.3;y_min = -2.25, y_max = 3.25
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
#linspace(x_min, x_max, nx)回傳一個numpy陣列,包含了從x_min到x_max等間隔的nx個值
#meshgrid()從坐標向量回傳網格點坐標矩陣,
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))

#ravel()呼叫它的陣列展平變為一維陣列
#c_()生成一個新矩陣,把x_grid.ravel()變為新矩陣的第一列,y_grid.ravel()變為新矩陣的第二列,最終shape為(nx*ny,0)
#如此,生成了一個20000行,2列的測驗集
#predict_proba()函式進行資料預測
z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])
z_proba = z_proba[:, 1].reshape(x_grid.shape)

#繪制邊界線
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')

plt.show()

4.2.1 meshgrid()函式:從坐標向量到坐標網格矩陣

numpy.meshgrid()函式:https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html

詳解meshgrid()函式參考資料:https://blog.csdn.net/lllxxq141592654/article/details/81532855

相關代碼:x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx),np.linspace(y_min, y_max, ny))

語法:X,Y=np.meshgrid(x,y),輸入:x,y是兩組一維陣列,輸出:X,Y是坐標矩陣

概念比較抽象,直接代入例子,上文的代碼中,x表示橫軸上[-3.3,3.3]等間隔的nx個點,y表示縱軸上[-2.25,3.25]等間隔的ny個點,我們可以動手畫出x軸、y軸上的間隔點,然后我們把x軸上的間隔點沿豎直方向發射直線,y軸上的間隔點橫向發射直線,這些直線一交叉就形成一張網格,豎向直線有nx條,橫向直線有ny條,處在這些直線交叉的點就叫做網格點,共有nx乘ny個,注意不包括坐標軸上的點,坐標軸上的點并不是交叉點!所有這些網格點的橫坐標從上到下,從左到右排列,形成一個坐標矩陣記為X,X就有ny行nx列,X形狀為(ny,nx),同理,所有網格點的縱坐標也形成一個坐標矩陣記為Y,Y形狀也是(ny,nx),網格大概的樣子如參考資料里的這張圖,綠色的點就是所有網格點,但注意它并不是按軸的左右極限均勻劃分的,所以我們只需要從這張圖里知道網格坐標矩陣的點是什么樣子的就行:

這里寫圖片描述

4.2.2 predict_proba()函式

詳解predict_proba()和predict()參考資料:http://sofasofa.io/forum_main_post.php?postid=1000600

相關代碼:z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])

函式的輸入np.c_[x_grid.ravel(), y_grid.ravel()]是nx*ny行2列的矩陣,作為測驗集,輸出z_proba也是nx*ny行2列,每一行代表預測該行樣本的標簽為0或為1的概率,2列是因為我們的標簽總共分兩類,第一列代表預測本行樣本的標簽是0的概率,第二列代表預測本行樣本的標簽是1的概率,每行的兩列概率值相加必須為1,

z_proba[:, 1]意思是預測所有的測驗集樣本的標簽為1的概率組成的一維陣列,共有nx*ny個值,所以形狀是1行nx*ny列,

z_proba = z_proba[:, 1].reshape(x_grid.shape),根據4.2.1的分析,坐標矩陣的形狀是(ny,nx),即x_grid.shape是(ny,nx),z_proba是由1行nx*ny列的一維陣列重塑為ny行nx列的二維陣列,

4.2.3 contour()函式

matplotlib.pyplot.contour:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.contour.html#matplotlib.pyplot.contour

相關代碼:plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')

語法:contour([X, Y,] Z, [levels], ...)

X,Y為等長的一維陣列,表示坐標點的位置

Z為二維陣列,表示平面點(Xi,Yi)映射的函式值,在我們代碼里,這個函式值z_proba代表的是每一個預測樣本點的標簽為1的概率值,

[levels]為int或其他,確定輪廓線/區域的數量和位置,這里設定0.5是因為我們邏輯回歸把大于等于0.5的和小于0.5的分成不同類,

4.3 可視化預測新樣本

### 可視化預測新樣本

plt.figure()
## new point 1
x_features_new1 = np.array([[0, -1]])
plt.scatter(x_features_new1[:,0],x_features_new1[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))

## new point 2
x_features_new2 = np.array([[1, 2]])
plt.scatter(x_features_new2[:,0],x_features_new2[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 2',xy=(1,2),xytext=(-1.5,2.5),color='red',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))

## 訓練樣本
plt.scatter(x_features[:,0],x_features[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')

# 可視化決策邊界
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')

plt.show()

4.3.1 annotate()函式:用文本text注釋點xy

matplotlib.pyplot.annotate:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.annotate.html#matplotlib.pyplot.annotate

相關代碼:plt.annotate(text='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))

語法:matplotlib.pyplot.annotate(text,xy,xytext,color,arrowprops,...)

text表示注釋文本,

xy表示要注釋的點坐標(x,y),

xytext表示放置文本的位置,

color表示注釋點顏色,

arrowprops表示在位置xy和xytext之間繪制箭頭,dict字典形式,鍵arrowstyle='-|>'表示箭頭樣式head_length = 0.4,head_width = 0.2,鍵connectionstyle='arc3'表示連接方式,連線的弧度= 0.0,鍵color='red'表示箭頭顏色是紅色,

5 模型預測

## 在訓練集和測驗集上分布利用訓練好的模型進行預測
y_label_new1_predict = lr_clf.predict(x_features_new1)
y_label_new2_predict = lr_clf.predict(x_features_new2)

print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)

## 由于邏輯回歸模型是概率預測模型(前文介紹的 p = p(y=1|x,\theta)),所有我們可以利用 predict_proba 函式預測其概率
y_label_new1_predict_proba = lr_clf.predict_proba(x_features_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_features_new2)

print('The New point 1 predict Probability of each class:\n',y_label_new1_predict_proba)
print('The New point 2 predict Probability of each class:\n',y_label_new2_predict_proba)
運行結果:
The New point 1 predict class:
 [0]
The New point 2 predict class:
 [1]
The New point 1 predict Probability of each class:
 [[0.69567724 0.30432276]]
The New point 2 predict Probability of each class:
 [[0.11983936 0.88016064]]

訓練好的回歸模型將x_features_new1預測為了類別0(判別面左下側),x_features_new2預測為了類別1(判別面右上側),其訓練得到的邏輯回歸模型的概率為0.5的判別面為上圖中藍色的線,

三、學習問題和解決方法記錄

Q:通過跟敲代碼,發現自己對python、numpy的語法很多都不熟,基礎不扎實,像是x_features[:,0]這樣的形式都不知道該如何解釋,

A:經過查詢,這屬于numpy陣列切片知識,在敲代碼的時候遇到不理解的矩陣、向量其實可以多列印看看生成的到底是什么,這樣更容易消化語法知識,

四、學習總結

雖然這次只是寫一個很小的例子,但是也從中看到自己基礎面不好的問題,以后要多敲代碼夯實基礎,另外,我發現“遇到問題、查詢、理解”的程序其實不慢,但當想整理下來整個思考程序,想自己給自己說明白并不容易,而且在整理程序中還會不經意發現一些隱藏的細節問題,總之,我認為學習不能止步于“感覺自己懂了”,而是應該更進一步“自己給自己講明白”,如果能達到“給別人講明白”就更好了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236597.html

標籤:python

上一篇:ORM正向和反向查詢

下一篇:Scrapy框架實戰(二):詳解 Scrapy 下載器中間件

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more