安全的關(guān)鍵.png)
使用這些基本 REST API 最佳實(shí)踐構(gòu)建出色的 API
關(guān)聯(lián)規(guī)則分析的目標(biāo)是發(fā)現(xiàn)數(shù)據(jù)集中不同屬性之間的關(guān)聯(lián)。為了達(dá)到這個(gè)目標(biāo),關(guān)聯(lián)規(guī)則算法設(shè)置了最小支持度閾值和最小置信度閾值。這些算法致力于在盡可能高效的方式下完成這個(gè)任務(wù)。
常見(jiàn)的關(guān)聯(lián)規(guī)則算法包括Apriori算法、AprioriTid算法和FP-growth算法。
分類算法的目標(biāo)是將數(shù)據(jù)集中的對(duì)象分配到預(yù)定義的類別中。以下是幾種經(jīng)典的分類算法:
回歸分析主要研究因變量(目標(biāo))和自變量(預(yù)測(cè)器)之間的關(guān)系。在大數(shù)據(jù)分析中,回歸分析是一種預(yù)測(cè)性的建模技術(shù),它通過(guò)研究因變量和影響它的自變量之間的回歸模型,來(lái)預(yù)測(cè)因變量的發(fā)展趨勢(shì)。當(dāng)有多個(gè)自變量時(shí),可以研究每個(gè)自變量對(duì)因變量的影響強(qiáng)度。
回歸分析的分類如下:
聚類分析處理的對(duì)象集合中,對(duì)象的類是未知的。它的目標(biāo)是將對(duì)象集合分組為多個(gè)由類似對(duì)象組成的簇。聚類分析的方法可以分為以下三類:
距離度量可用于在數(shù)據(jù)挖掘中明確樣本數(shù)據(jù)相似度,通常可以計(jì)算樣本間的距離,如下為常用距離度量的介紹。
樣本數(shù)據(jù)以如下三個(gè)人的身高體重示例:
展示到坐標(biāo)圖中是這樣的:
曼哈頓距離:?也稱曼哈頓街區(qū)距離,就如從街區(qū)的一個(gè)十字路口點(diǎn)到另一個(gè)十字路口點(diǎn)的距離, 二維空間(多維空間按同理擴(kuò)展)用公式表示為
歐氏距離:表示為點(diǎn)到點(diǎn)的距離。二維空間(多維空間按同理擴(kuò)展)的公式表示為
閔可夫斯基距離:其實(shí)就是距離方法的通用概括,當(dāng) p=1 既是曼哈頓距離,當(dāng) p=2 既是歐氏距離。當(dāng)p越大,單一維度的差值對(duì)整體的影響就越大。
余弦相關(guān)系數(shù):
樣本數(shù)據(jù)視為向量,通過(guò)兩向量間的夾角余弦值確認(rèn)相關(guān)性,數(shù)值范圍[-1,1]。-1表示負(fù)相關(guān),0表示無(wú)關(guān),1表示正相關(guān)。
余弦相關(guān)系數(shù)的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):余弦相似度與向量的幅值無(wú)關(guān),只與向量的方向相關(guān),在文檔相似度(TF-IDF)和圖片相似性(histogram)計(jì)算上都有它的身影;而且在樣本數(shù)值稀疏的時(shí)候仍可以使用。
缺點(diǎn):余弦相似度受到向量的平移影響,上式如果將 x 平移到 x+1, 余弦值就會(huì)改變。(可以理解為受樣本的起始標(biāo)準(zhǔn)的影響,接下來(lái)介紹的皮爾遜相關(guān)系數(shù)可以消除這個(gè)影響)
皮爾遜相關(guān)系數(shù):
計(jì)算出了樣本向量間的相關(guān)性,數(shù)值范圍[-1,1]。
考慮計(jì)算的遍歷的次數(shù),有一個(gè)替代公式可以近似計(jì)算皮爾遜相關(guān)系數(shù):
皮爾遜相關(guān)系數(shù)優(yōu)點(diǎn):可消除每個(gè)分量標(biāo)準(zhǔn)不同(分?jǐn)?shù)膨脹)的影響,具有平移不變性和尺度不變性。
數(shù)據(jù)中如果各分量的單位尺度差異很大,可以使用數(shù)據(jù)標(biāo)準(zhǔn)化消除不同分量間單位尺度的影響,,加速模型收斂的效率,常用的方法有三種:
min-max 標(biāo)準(zhǔn)化:將數(shù)值范圍縮放到(0,1),但沒(méi)有改變數(shù)據(jù)分布。max為樣本最大值,min為樣本最小值。
z-score 標(biāo)準(zhǔn)化:將數(shù)值范圍縮放到0附近, 經(jīng)過(guò)處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布。u是平均值,σ是標(biāo)準(zhǔn)差。
修正的標(biāo)準(zhǔn)z-score:修正后可以減少樣本數(shù)據(jù)異常值的影響。將z-score標(biāo)準(zhǔn)化公式中的均值改為中位數(shù),將標(biāo)準(zhǔn)差改為絕對(duì)偏差。
其中asd絕對(duì)偏差:u為中位數(shù),card(x)為樣本個(gè)數(shù)
模型原理:Apriori算法是一種用于頻繁項(xiàng)集挖掘和關(guān)聯(lián)規(guī)則學(xué)習(xí)的算法。其主要思想是通過(guò)候選生成和剪枝策略發(fā)現(xiàn)頻繁項(xiàng)集。它利用了數(shù)據(jù)集中的項(xiàng)集(items)的先驗(yàn)知識(shí),通過(guò)減少不必要的搜索來(lái)提高效率。
使用場(chǎng)景:常用于市場(chǎng)籃子分析,如超市購(gòu)物籃分析,以發(fā)現(xiàn)商品之間的關(guān)聯(lián)關(guān)系。
Python示例代碼:
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
# 假設(shè)df是包含交易數(shù)據(jù)的DataFrame,'item'是商品列
frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence",min_threshold=0.7)
基于用戶的協(xié)同過(guò)濾是通過(guò)計(jì)算用戶之間的距離找出最相似的用戶(需要將所有的評(píng)價(jià)數(shù)據(jù)在讀取在內(nèi)存中處理進(jìn)行推薦),并將相似用戶評(píng)價(jià)過(guò)的物品推薦給目標(biāo)用戶。
而基于物品的協(xié)同過(guò)濾則是找出最相似的物品(通過(guò)構(gòu)建一個(gè)物品的相似度模型來(lái)做推薦),再結(jié)合用戶的評(píng)價(jià)來(lái)給出推薦結(jié)果。算法常用有?修正余弦相似度算法:以物品的評(píng)分作為物品的屬性值,通過(guò)對(duì)比物品i,j的共有的用戶相對(duì)評(píng)分的計(jì)算相關(guān)性s(i,j)。
import numpy as np
# 用戶-物品評(píng)分矩陣
ratings = np.array([[5, 3, 0, 1],
[4, 0, 0, 0],
[0, 5, 3, 0],
[0, 4, 5, 5]])
# 計(jì)算用戶之間的相似度
def similarity(ratings):
n = ratings.shape[0]
sim = np.zeros((n, n))
for i in range(n):
for j in range(n):
if i != j:
sim[i][j] = np.corrcoef(ratings[i], ratings[j])[0, 1]
return sim
# 基于用戶的協(xié)同過(guò)濾推薦算法
def user_based_collaborative_filtering(ratings, threshold=0.6):
n = ratings.shape[0]
sim = similarity(ratings)
rec_list = {}
for i in range(n):
for j in range(n):
if i != j and sim[i][j] > threshold:
for k in range(len(ratings[j])):
if ratings[j][k] == 0 and ratings[i][k] != 0:
rec_list[k] = ratings[i][k]
return rec_list
# 獲取推薦結(jié)果
rec_list = user_based_collaborative_filtering(ratings)
print(rec_list)
...
# KNN核心邏輯手寫
def knn(self, oj_list):
weight_dict = {"Iris-setosa":0.0, "Iris-versicolor":0.0, "Iris-virginica":0.0}
for atuple in oj_list:
weight_dict[atuple[1]] += (1.0 / atuple[0])
rel_class = [(key, value) for key, value in weight_dict.items()]
#print(sorted(rel_class, key=lambda x:x[1], reverse=True))
rel_class = sorted(rel_class, key=lambda x:x[1], reverse=True)[0][0]
return rel_class
...
# 調(diào)用sklearn直接實(shí)現(xiàn)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix
# 加載鳶尾花數(shù)據(jù)集
iris = load_iris()
X = iris.data
y = iris.target
# 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建KNN分類器,并設(shè)置鄰居數(shù)量為3
knn = KNeighborsClassifier(n_neighbors=3)
# 使用訓(xùn)練數(shù)據(jù)訓(xùn)練KNN分類器
knn.fit(X_train, y_train)
# 使用測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = knn.predict(X_test)
# 輸出分類器的評(píng)估結(jié)果
print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
前面我們討論的協(xié)同推薦算法,需要在用戶生成的各種數(shù)據(jù)上進(jìn)行深入分析,因此也被稱為社會(huì)化過(guò)濾算法。然而,這種算法存在一些明顯的問(wèn)題,如數(shù)據(jù)的稀疏性、算法的可擴(kuò)展性,以及過(guò)度依賴用戶數(shù)據(jù)。為了解決這些問(wèn)題,我們可以采用基于物品特征值分類的算法。這個(gè)算法主要分為兩個(gè)步驟:第一步是特征值的選取。這一步是至關(guān)重要的,因?yàn)樗鼪Q定了算法的準(zhǔn)確性和效率。我們需要挑選出具有代表性且能提供區(qū)分度的特征值。以Iris花為例,我們可以選取花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度和花瓣寬度作為特征值。
第二步是計(jì)算距離。在這一步中,我們將測(cè)試集與訓(xùn)練集的特征值進(jìn)行比較,計(jì)算它們之間的曼哈頓距離。通過(guò)這種方式,我們可以找到與測(cè)試集最相似的k個(gè)訓(xùn)練樣本。然后,我們使用加權(quán)后的結(jié)果來(lái)預(yù)測(cè)分類。
然而,KNN分類算法也存在一些缺點(diǎn)。首先,它無(wú)法對(duì)分類結(jié)果的置信度進(jìn)行量化,這意味著我們無(wú)法確定分類的準(zhǔn)確性。其次,它是一種被動(dòng)學(xué)習(xí)的算法,這意味著每次進(jìn)行測(cè)試時(shí)都需要遍歷所有的訓(xùn)練集,這可能導(dǎo)致算法的效率較低。
...
# bayes 核心邏輯手寫
def bayes(self):
#訓(xùn)練組的條件概率
for word in self.vocabulary:
for category,value in self.prob.items():
if word not in self.prob[category]:
count = 0
else :
count = self.prob[category][word]
#優(yōu)化條件概率公式
self.prob[category][word] = (count + 1) / (self.total[category] + len(self.vocabulary))
...
# 調(diào)用sklearn實(shí)現(xiàn)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
# 假設(shè)你有一個(gè)文本數(shù)據(jù)集,存儲(chǔ)在CSV文件中,有兩列:'text'和'label'
data = pd.read_csv('text_data.csv')
# 提取特征和標(biāo)簽
X = data['text'].values
y = data['label'].values
# 切分?jǐn)?shù)據(jù)集為訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用CountVectorizer將文本轉(zhuǎn)換為向量
vectorizer = CountVectorizer()
X_train_transformed = vectorizer.fit_transform(X_train)
X_test_transformed = vectorizer.transform(X_test)
# 使用樸素貝葉斯分類器進(jìn)行訓(xùn)練
classifier = MultinomialNB()
classifier.fit(X_train_transformed, y_train)
# 對(duì)測(cè)試集進(jìn)行預(yù)測(cè)
y_pred = classifier.predict(X_test_transformed)
# 計(jì)算準(zhǔn)確率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
貝葉斯分類算法是基于概率的分類算法。相比于KNN分類算法,它是主動(dòng)學(xué)習(xí)的算法,它會(huì)根據(jù)訓(xùn)練集建立一個(gè)模型,并用這個(gè)模型對(duì)新樣本進(jìn)行分類,速度也會(huì)快很多。
貝葉斯分類算法的理論基礎(chǔ)是基于條件概率的公式(應(yīng)用于現(xiàn)實(shí)中P(X|Y&Z)不直觀得出,而P(Y|X)*P(Z|X)比較直觀得出),并假設(shè)已存在的子事件(y,z…實(shí)際應(yīng)用中會(huì)有多個(gè))間是相互獨(dú)立的(因此也稱為樸素貝葉斯),當(dāng)y,z事件假設(shè)為獨(dú)立便有:
如下舉例推測(cè)買牛奶和有機(jī)食品,再會(huì)買綠茶的概率:
第一步:計(jì)算先驗(yàn)概率及條件概率
先驗(yàn)概率:為單獨(dú)事件發(fā)生的概率,如P(買綠茶),P(有機(jī)食品)
條件概率(后驗(yàn)概率):y事件已經(jīng)發(fā)生,觀察y數(shù)據(jù)集后得出x發(fā)生的概率。如P(買有機(jī)食品|買綠茶),通過(guò)以下公式計(jì)算(nc表示y數(shù)據(jù)集下x的發(fā)生頻數(shù),n為y數(shù)據(jù)集的總數(shù)):
上式存在一個(gè)缺陷,當(dāng)一個(gè)條件概率 P(y|x)為0時(shí),整體的預(yù)測(cè)結(jié)果P(x) * P(y|x) * P(z|x)只能為0,這樣便不能更全面地預(yù)測(cè)。
修正后的條件概率:(公式摘自Tom Mitchell《機(jī)器學(xué)習(xí)》。m是一個(gè)常數(shù),表示等效樣本大小。決定常數(shù)m的方法有很多,我們這里可以使用預(yù)測(cè)結(jié)果的類別來(lái)作為m,比如投票有贊成和否決兩種類別,所以m就為2。p則是相應(yīng)的先驗(yàn)概率,比如說(shuō)贊成概率是0.5,那p(贊成)就是0.5。):
第二歩:根據(jù)貝葉斯公式做出預(yù)測(cè)
由公式計(jì)算比較y&z事件發(fā)生下,不同x事件發(fā)生的概率差異,如得出P(x=喜歡),P(x=不喜歡) 的概率大小,預(yù)測(cè)為概率比較大的事件。因?yàn)镻(y)*p(z)在上式都一樣,因此公式可以簡(jiǎn)化為計(jì)算概率最大項(xiàng)而預(yù)測(cè)分類:
貝葉斯算法的優(yōu)點(diǎn):能夠給出分類結(jié)果的置信度;它是一種主動(dòng)學(xué)習(xí)算法,速度更快。
貝葉斯算法的缺點(diǎn):需要特定格式;數(shù)值型數(shù)據(jù)需要轉(zhuǎn)換為類別計(jì)算概率或用高斯分布計(jì)算概率;
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 加載數(shù)據(jù)集,這里我們使用的是MNIST數(shù)據(jù)集,你可以替換成自己的數(shù)據(jù)集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
# 對(duì)數(shù)據(jù)進(jìn)行歸一化處理
train_images = train_images / 255.0
test_images = test_images / 255.0
# 構(gòu)建DNN模型
model = models.Sequential()
model.add(layers.Dense(512, activation='sigmoid', input_shape=(28, 28))) # 輸入層,28x28是MNIST圖片的大小
model.add(layers.Dense(512, activation='sigmoid')) # 隱藏層
model.add(layers.Dense(10, activation='softmax')) # 輸出層,10個(gè)類別,使用softmax激活函數(shù)進(jìn)行多分類
# 編譯模型,設(shè)置損失函數(shù)、優(yōu)化器和評(píng)估指標(biāo)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 訓(xùn)練模型
model.fit(train_images, train_labels, epochs=5)
# 在測(cè)試集上評(píng)估模型性能
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('\nTest accuracy:', test_acc)
# 使用模型進(jìn)行預(yù)測(cè)并可視化結(jié)果
predictions = model.predict(test_images)
predicted_class = np.argmax(predictions, axis=1) # 獲取預(yù)測(cè)類別
true_class = np.argmax(test_labels, axis=1) # 獲取真實(shí)類別
plt.figure(figsize=(10, 5))
for i in range(len(test_images)):
plt.subplot(1, 2, i+1)
plt.imshow(test_images[i].reshape(28, 28), cmap='gray')
plt.title('Predicted: ' + str(predicted_class[i]) + ', True: ' + str(true_class[i]))
plt.show()
DNN分類算法實(shí)現(xiàn)了輸入圖片特征向量X,輸出Y(范圍0~1)預(yù)測(cè)X的分類。
第一步,得到關(guān)于X線性回歸函數(shù)
可以通過(guò)線性回歸得到WX + b,其中W是權(quán)重,b是偏差值。但不能用本式表述預(yù)測(cè)的值,因?yàn)檩敵鯵的值需要在(0~1)區(qū)間;
第二歩,通過(guò)激活函數(shù)轉(zhuǎn)換
激活函數(shù)的特點(diǎn)是可以將線性函數(shù)轉(zhuǎn)換為非線性函數(shù),并且有輸出值有限,可微分,單調(diào)性的特點(diǎn)。本例使用sigmoid,使輸出為預(yù)測(cè)值Y=sigmoid(WX+b);
多個(gè)神經(jīng)網(wǎng)絡(luò)層,也就是重復(fù)第一、二步,類似sigmoid(sigmoid(WX+b))..的復(fù)合函數(shù)。
第三歩,構(gòu)建Cost函數(shù)
訓(xùn)練W,b更好的預(yù)測(cè)真實(shí)的類別需要構(gòu)建Cost代價(jià)函數(shù),y^為sigmoid(WX+b)的預(yù)測(cè)分類值,y為實(shí)際分類值(0或者1):
其中L(y^,y)稱為損失函數(shù)
訓(xùn)練的目的就是為了讓L(y^,y)足夠小,也就是當(dāng)y實(shí)際分類值為1時(shí),y^要盡量偏向1。y實(shí)際分類值為0時(shí),y^盡量小接近0。
第四步,梯度下降得到Cost函數(shù)的極小值
通過(guò)對(duì)W,b兩個(gè)參數(shù)求偏導(dǎo),不斷迭代往下坡的的位置移動(dòng)(對(duì)w,b值往極小值方向做優(yōu)化,其中α為學(xué)習(xí)率控制下降的幅度),全局最優(yōu)解也就是代價(jià)函數(shù)(成本函數(shù))J (w,b)這個(gè)凸函數(shù)的極小值點(diǎn)。
第五步、通過(guò)訓(xùn)練好的W,b預(yù)測(cè)分類。
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成樣本數(shù)據(jù)
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 實(shí)例化層次聚類模型,n_clusters為聚類數(shù)
cluster = AgglomerativeClustering(n_clusters=4)
# 擬合數(shù)據(jù)
cluster.fit(X)
# 獲取聚類標(biāo)簽
labels = cluster.labels_
# 繪制結(jié)果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.show()
(2)K-means++聚類
注:Kmean算法與Kmean++區(qū)別在于初始的中心點(diǎn)是直接隨機(jī)選取k各點(diǎn)。
from sklearn.cluster import KMeans
from sklearn import datasets
import matplotlib.pyplot as plt
# 加載Iris數(shù)據(jù)集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 創(chuàng)建KMeans實(shí)例并擬合數(shù)據(jù)
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
# 獲取聚類標(biāo)簽和聚類中心點(diǎn)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
# 繪制聚類結(jié)果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=300) # 繪制聚類中心點(diǎn)
plt.show()
k-means++算法可概括為:
(1)基于各點(diǎn)到中心點(diǎn)得距離分量,依次隨機(jī)選取到k個(gè)元素作為中心點(diǎn):先隨機(jī)選擇一個(gè)點(diǎn)。重復(fù)以下步驟,直到選完k個(gè)點(diǎn)。
計(jì)算每個(gè)數(shù)據(jù)點(diǎn)dp(n)到各個(gè)中心點(diǎn)的距離(D),選取最小的值D(dp);
根據(jù)D(dp)距離所占的份量來(lái)隨機(jī)選取下一個(gè)點(diǎn)作為中心點(diǎn)。
(2)根據(jù)各點(diǎn)到中心點(diǎn)的距離分類;
(3)計(jì)算各個(gè)分類新的中心點(diǎn)。重復(fù)(2、3),直至滿足條件。
文章轉(zhuǎn)自微信公眾號(hào)@算法進(jìn)階
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)