確定最佳聚類數matlab代碼_詳解DBSCAN聚類

使用DBSCAN標識為員工分組

cf27109dbb09b15c0f54817c3da4a0c2.png

照片由Ishan @seefromthesky 在 Unsplash拍攝

基于密度的噪聲應用空間聚類(DBSCAN)是一種無監督的ML聚類算法。無監督的意思是它不使用預先標記的目標來聚類數據點。聚類是指試圖將相似的數據點分組到人工確定的組或簇中。它可以替代KMeans和層次聚類等流行的聚類算法。

在我們的示例中,我們將檢查一個包含15,000名員工的人力資源數據集。數據集包含員工的工作特征,如工作滿意度、績效評分、工作量、任職年限、事故、升職次數。

KMeans vs DBSCAN

KMeans尤其容易受到異常值的影響。當算法遍歷質心時,在達到穩定性和收斂性之前,離群值對質心的移動方式有顯著的影響。此外,KMeans在集群大小和密度不同的情況下還存在數據精確聚類的問題。K-Means只能應用球形簇,如果數據不是球形的,它的準確性就會受到影響。最后,KMeans要求我們首先選擇希望找到的集群的數量。下面是KMeans和DBSCAN如何聚類同一個數據集的示例。

7d26f0f891da816b96d50a21436360cb.png
7609b19dfa36cf4a70b139b588ffbdc2.png

另一方面,DBSCAN不要求我們指定集群的數量,避免了異常值,并且在任意形狀和大小的集群中工作得非常好。它沒有質心,聚類簇是通過將相鄰的點連接在一起的過程形成的。

DBSCAN是如何實現的呢?

首先,讓我們定義Epsilon和最小點、應用DBSCAN算法時需要的兩個參數以及一些額外的參數。

1. Epsilon (?):社區的最大半徑。如果數據點的相互距離小于或等于指定的epsilon,那么它們將是同一類的。換句話說,它是DBSCAN用來確定兩個點是否相似和屬于同一類的距離。更大的epsilon將產生更大的簇(包含更多的數據點),更小的epsilon將構建更小的簇。一般來說,我們喜歡較小的值是因為我們只需要很小一部分的數據點在彼此之間的距離內。但是如果太小,您會將集群分割的越來越小。

1. 最小點(minPts):在一個鄰域的半徑內minPts數的鄰域被認為是一個簇。請記住,初始點包含在minPts中。一個較低的minPts幫助算法建立更多的集群與更多的噪聲或離群值。較高的minPts將確保更健壯的集群,但如果集群太大,較小的集群將被合并到較大的集群中。

如果"最小點"= 4,則在彼此距離內的任意4個或4個以上的點都被認為是一個簇。

其他參數

核心點:核心數據點在其近鄰距離內至少有的最小的數據點個數。

我一直認為DBSCAN需要一個名為"core_min"的第三個參數,它將確定一個鄰域點簇被認為是聚類簇之前的最小核心點數量。

邊界點:邊界數據點位于郊區,就像它們屬于近鄰點一樣。(比如w/在epsilon距離內的核心點),但需要小于minPts。

離群點:這些點不是近鄰點,也不是邊界點。這些點位于低密度地區。

13b268302d0ca7804aa1336fc873de38.png

首先,選擇一個在其半徑內至少有minPts的隨機點。然后對核心點的鄰域內的每個點進行評估,以確定它是否在epsilon距離內有minPts (minPts包括點本身)。如果該點滿足minPts標準,它將成為另一個核心點,集群將擴展。如果一個點不滿足minPts標準,它成為邊界點。隨著過程的繼續,算法開始發展成為核心點"a"是"b"的鄰居,而"b"又是"c"的鄰居,以此類推。當集群被邊界點包圍時,這個聚類簇已經搜索完全,因為在距離內沒有更多的點。選擇一個新的隨機點,并重復該過程以識別下一個簇。

d3fa367b0d9971b51941016a94583313.png

如何確定最優的Epsilon值

估計最優值的一種方法是使用k近鄰算法。如果您還記得的話,這是一種有監督的ML聚類算法,它根據新數據點與其他"已知"數據點的距離來聚類。我們在帶標記的訓練數據上訓練一個KNN模型,以確定哪些數據點屬于哪個聚類。當我們將模型應用到新數據時,算法根據與訓練過的聚類的距離來確定新數據點屬于哪一個聚類。我們必須確定"k"參數,它指定在將新數據點分配給一個集群之前,模型將考慮多少個最鄰近點。

為了確定最佳的epsilon值,我們計算每個點與其最近/最近鄰居之間的平均距離。然后我們繪制一個k距離,并選擇在圖的"肘部"處的epsilon值。在y軸上,我們繪制平均距離,在x軸上繪制數據集中的所有數據點。

如果選取的epsilon太小,很大一部分數據將不會被聚類,而一個大的epsilon值將導致聚類簇被合并,大部分數據點將會在同一個簇中。一般來說,較小的值比較合適,并且作為一個經驗法則,只有一小部分的點應該在這個距離內。

如何確定最佳minPts

通常,我們應該將minPts設置為大于或等于數據集的維數。也就是說,我們經常看到人們用特征的維度數乘以2來確定它們的minPts值。

就像用來確定最佳的epsilon值的"肘部方法"一樣,minPts的這種確定方法并不是100%正確的。

DBSCAN聚類的評價方式

影像法:該技術測量集群之間的可分離性。首先,找出每個點與集群中所有其他點之間的平均距離。然后測量每個點和其他簇中的每個點之間的距離。我們將兩個平均值相減,再除以更大的那個平均值。

我們最終想要的是一種較高(比如最接近1)的分數,表明存在較小的簇內平均距離(緊密簇)和較大的簇間平均距離(簇間分離良好)。

集群可視化解釋:獲得集群之后,解釋每個集群非常重要。這通常是通過合并原始數據集和集群并可視化每個集群來完成的。每個集群越清晰越獨特越好。我們將在下面實現這個過程。

DBSCAN的優點

· 不需要像KMeans那樣預先確定集群的數量

· 對異常值不敏感

· 能將高密度數據分離成小集群

· 可以聚類非線性關系(聚類為任意形狀)

DBSCAN的缺點

· 很難在不同密度的數據中識別集群

· 難以聚類高維數據

· 對極小點的參數非常敏感

讓我們嘗試一下

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport plotly.offline as pyopyo.init_notebook_mode()import plotly.graph_objs as gofrom plotly import toolsfrom plotly.subplots import make_subplotsimport plotly.offline as pyimport plotly.express as pxfrom sklearn.cluster import DBSCANfrom sklearn.neighbors import NearestNeighborsfrom sklearn.metrics import silhouette_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import PCAplt.style.use('fivethirtyeight')from warnings import filterwarningsfilterwarnings('ignore')with open('HR_data.csv') as f:    df =  pd.read_csv(f, usecols=['satisfaction_level', 'last_evaluation', 'number_project',       'average_montly_hours', 'time_spend_company', 'Work_accident',       'promotion_last_5years'])f.close()
d8e4b22f962f20a484701e94b2d84c6e.png

1. 標準化

由于數據集中的特特征不在相同的范圍內,所以我們需要對整個數據集進行標準化。換句話說,我們數據集中的每個特征對于它們的數據都有獨特的大小和范圍。滿意度水平增加一分并不等于最后評價增加一分,反之亦然。由于DBSCAN利用點之間的距離(歐幾里得)來確定相似性,未縮放的數據會產生問題。如果某一特征在其數據中具有較高的可變性,則距離計算受該特征的影響較大。通過縮放特征,我們將所有特征對齊到均值為0,標準差為1。

scaler = StandardScaler()scaler.fit(df)X_scale = scaler.transform(df)df_scale = pd.DataFrame(X_scale, columns=df.columns)df_scale.head()
ad612364d26055999817c6c7c8e23f67.png

2. 特征降維

在一些算法如KMeans中,如果數據集的特征維度太大,就很難精確地構建聚類。高維數并不一定意味著成百上千維度的特征。甚至10個維度的特征也會造成準確性問題。

特征降維背后的理論是將原始特征集轉換為更少的人工派生特征,這些特征仍然保留了原始特征中包含的大部分信息。

最流行的特征降維技術之一是主成分分析(PCA)。PCA將原始數據集縮減為指定數量的特征,并將這些特征稱為主成分。我們必須選擇我們希望看到的主成分的數量。我們在我關于KMeans集群的文章中討論了減少特性,我強烈建議您看一看()。

首先,我們需要確定適當的主成分數量。3個主成分似乎占了大約75%的方差。

pca = PCA(n_components=7)pca.fit(df_scale)variance = pca.explained_variance_ratio_ var=np.cumsum(np.round(variance, 3)*100)plt.figure(figsize=(12,6))plt.ylabel('% Variance Explained')plt.xlabel('# of Features')plt.title('PCA Analysis')plt.ylim(0,100.5)plt.plot(var)
f64f58108ada29ad7c78f5b01be262c2.png

現在我們知道了維持一個特定百分比的方差所需的主成分的數量,讓我們對原始數據集應用一個3成分的主成分分析。請注意,第一個主成分占到與原始數據集方差的26%。在本文的其余部分中,我們將使用"pca_df"數據框架。

pca = PCA(n_components=3)pca.fit(df_scale)pca_scale = pca.transform(df_scale)pca_df = pd.DataFrame(pca_scale, columns=['pc1', 'pc2', 'pc3'])print(pca.explained_variance_ratio_)
450b1a8d29aeb38022885f1f01d8eec0.png

在3D空間中繪制數據,可以看到DBSCAN存在一些潛在的問題。DBSCAN的一個主要缺點就是它不能準確地對不同密度的數據進行聚類,從下面的圖中,我們可以看到兩個不同密度的單獨集群。在應用DBSCAN算法時,我們可能能夠在數據點較少的聚類結果中找到不錯的聚類方式,但在數據點較多的聚類中的許多數據點可能被歸類為離群值/噪聲。這當然取決于我們對epsilon和最小點值的選擇。

Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(colorscale='Greys', opacity=0.3, size = 10, ))layout = go.Layout(margin=dict(l=0,r=0),scene = Scene, height = 1000,width = 1000)data = [trace]fig = go.Figure(data = data, layout = layout)fig.show()
e9f3af81dd361129ff2cfe279d8536fa.png

3.DBSCAN聚類

方法1

在應用聚類算法之前,我們必須使用前面討論過的"肘形法"來確定合適的epsilon級別。看起來最佳的值在0.2左右。最后,由于我們的數據有3個主成分,我們將把最小點標準設置為6。

plt.figure(figsize=(10,5))nn = NearestNeighbors(n_neighbors=5).fit(pca_df)distances, idx = nn.kneighbors(pca_df)distances = np.sort(distances, axis=0)distances = distances[:,1]plt.plot(distances)plt.show()
91234398c634d7716ab35173fae89acb.png

將epsilon設置為0.2,將min_samples設置為6,得到了53個集群,影像分數為-0.521,以及超過1500個被認為是離群值/噪聲的數據點。在某些研究領域,53個集群可能被認為是有用的,但我們有一個15000名員工的數據集。從業務的角度來看,我們需要一些可管理的集群(即3-5個),以便更好地分配工作場所。此外,剪影得分-0.521表明數據點是不正確的聚集。

看看下面的3D圖,我們可以看到一個包含了大多數數據點的集群。出現了一個較小但很重要的聚類簇,但剩下52個聚類簇的規模要小得多。從業務角度來看,這些集群提供的信息不是很多,因為大多數員工只屬于兩個集群。組織希望看到幾個大的集群,以確定它們的有效性,但也能夠從事一些針對集群員工的組織主動性工作(例如。增加培訓、薪酬變化等)。

db = DBSCAN(eps=0.2, min_samples=6).fit(pca_df)labels = db.labels_# Number of clusters in labels, ignoring noise if present.n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)print('Estimated number of noise points: %d' % n_noise_)print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(pca_df, labels))
88184374b500de3d6519248fbcff9917.png
Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))labels = db.labels_trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'gray',width = 5)))layout = go.Layout(scene = Scene, height = 1000,width = 1000)data = [trace]fig = go.Figure(data = data, layout = layout)fig.update_layout(, font=dict(size=12,))fig.show()Image for post
57717c2712e6df56fc8f1c4a4d85173f.png

方法2

我們不使用"肘部方法"和最小值啟發式方法,而是使用迭代方法來微調我們的DBSCAN模型。在對數據應用DBSCAN算法時,我們將迭代一系列的epsilon和最小點值。

在我們的例子中,我們將迭代0.5到1.5之間的epsilon值和2-7之間的minPts。for循環將使用這組值運行DBSCAN算法,并為每次迭代生成集群數量和影像分數。請記住,您需要根據數據調整參數。您可能會在一組參數上運行此代碼,并發現產生的最佳影像分數是0.30。為了將更多的點包含到一個集群中,您可能需要增加值。

pca_eps_values = np.arange(0.2,1.5,0.1) pca_min_samples = np.arange(2,5) pca_dbscan_params = list(product(pca_eps_values, pca_min_samples))pca_no_of_clusters = []pca_sil_score = []pca_epsvalues = []pca_min_samp = []for p in pca_dbscan_params:    pca_dbscan_cluster = DBSCAN(eps=p[0], min_samples=p[1]).fit(pca_df)    pca_epsvalues.append(p[0])    pca_min_samp.append(p[1])pca_no_of_clusters.append(len(np.unique(pca_dbscan_cluster.labels_)))    pca_sil_score.append(silhouette_score(pca_df, pca_dbscan_cluster.labels_))pca_eps_min = list(zip(pca_no_of_clusters, pca_sil_score, pca_epsvalues, pca_min_samp))pca_eps_min_df = pd.DataFrame(pca_eps_min, columns=['no_of_clusters', 'silhouette_score', 'epsilon_values', 'minimum_points'])pca_ep_min_df
9249a36b40b999929d0ce9525ecd3269.png

我們可以看到,通過我們的epsilon和minPts的迭代,我們已經獲得了很大范圍的簇數和影像分數。0.9到1.1之間的epsilon分數開始產生可管理的集群數量。將epsilon增加到1.2或更高會導致集群數量太少,無法在商業上發揮作用。此外,其中一些集群可能只是噪音。我們稍后會講到。

增加的epsilon會減少集群的數量,但每個集群也會開始包含更多的離群點/噪聲數據點,這一點也可以理解為有一定程度的收益遞減。

為了簡單起見,讓我們選擇7個集群并檢查集群分布情況。(epsilon: 1.0和minPts: 4)。

同樣重要的是,運行此代碼串時肯定會遇到的一個常見錯誤。有時,當你設置的參數不合適,for循環最終會變成epsvalues和minsamples的組合,這只會產生一個集群。但是,silhouette ette_score函數至少需要定義兩個集群。您需要限制參數以避免此問題。

在上面的示例中,如果我們將epsilon參數的范圍設置為0.2到2.5,那么很可能會生成一個集群并最終導致錯誤。

0ad82072c483a31f92e4eb25ddd1dd42.png

你可能會問自己"我們不是應該獲得7個集群嗎?"答案是肯定的,如果我們看一下獨特的標簽/集群,我們看到每個數據點有7個標簽。根據Sklearn文檔,標簽"-1"等同于一個"嘈雜的"數據點,它還沒有被聚集到6個高密度的集群中。我們自然不希望將任何"-1"標簽考慮為一個集群,因此,它們將從計算中刪除。

db = DBSCAN(eps=1.0, min_samples=4).fit(pca_df)labels = db.labels_# Number of clusters in labels, ignoring noise if present.n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)print('Estimated number of noise points: %d' % n_noise_)print("Silhouette Coefficient: %0.3f" % silhouette_score(pca_df, labels))
9bf1824e3bb650626e54a0e4ee7d8ed8.png
set(labels)
403872efe6551708f6a84efe816aa576.png

從6個DBSCAN派生集群的3D圖中可以看出,盡管密度較小,但位于圖頂端的密度較小的集群對DBSCAN并沒有造成太大影響。如果您還記得的話,DBSCAN很難正確地集群各種密度的數據。頂部的集群和更大的底部集群之間的距離很可能大于1.0的epsilon值。

也就是說,數據集包含額外的高密度集群,但是我們的epsilon和minPts太大了。底部的聚類簇包含至少兩個高密度的聚類簇,然而,由于底部聚類簇的高密度降低了epsilon和minPts,只會產生許多更小的聚類簇。這也是DBSCAN的主要缺點。我一直認為DBSCAN需要第三個參數"min_core",它將確定一個集群可以被視為有效集群之前的最小核心點數量。

4acc78a99be9e014eb0e52a4b396f453.png
Scene = dict(xaxis = dict(title  = 'PC1'),yaxis = dict(title  = 'PC2'),zaxis = dict(title  = 'PC3'))# model.labels_ is nothing but the predicted clusters i.e y_clusterslabels = db.labels_trace = go.Scatter3d(x=pca_df.iloc[:,0], y=pca_df.iloc[:,1], z=pca_df.iloc[:,2], mode='markers',marker=dict(color = labels, colorscale='Viridis', size = 10, line = dict(color = 'gray',width = 5)))layout = go.Layout(scene = Scene, height = 1000,width = 1000)data = [trace]fig = go.Figure(data = data, layout = layout)fig.update_layout(DBSCAN Clusters (6) Derived from PCA'", font=dict(size=12,))fig.show()

在我們開始之前,讓我們快速了解一下每個集群中的員工數量。似乎cluster 0包含了大部分信息不太豐富的數據點。事實上,如果我們使用0.5的epsilon值和5的minPts運行算法,就會產生63個集群,集群0仍然會包含99%的員工人口。

np.unique(labels, return_counts=True)
f310c466fb07dfb7c5c4cb298ab04590.png

小結

DBSCAN,一種密度聚類算法,常用于非線性或非球面數據集。epsilon和minPts是兩個必需的參數。epsilon是附近數據點的半徑,這些數據點需要被認為是足夠"相似"才能開始聚類。最后,minPts是需要在半徑內的數據點的最小數目。

在我們的示例中,我們試圖根據工作特征對包含15,000名員工的數據集進行聚類。我們首先標準化了數據集以縮放特征。接下來,我們應用主成分分析將維度/特征的數量減少到3個主成分。使用"肘部法",我們估計了0.2的epsilon值和6的minPts。使用這些參數,我們能夠獲得53個集群,1500個離群值和-0.52的影響分數。不用說,結果并不是很理想。

接下來,我們嘗試了一種迭代的方法來微調epsilon和minPts。我們已經確定了epsilon值為1.0和minPts值為4。該算法返回6個有效的集群(一個-1集群),只有7個異常值,以及0.46的可觀影像分數。然而,在繪制派生集群時,發現第一個集群包含99%的員工。從業務的角度來看,我們希望我們的集群能夠更加均衡地分布,從而為我們提供關于員工的良好見解。

DBSCAN似乎不是這個特定數據集的最佳聚類算法。

作者:Kamil Mysiak

deephub翻譯組:孟翔杰

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

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

相關文章

Arrays.asList 使用細節

通常初始化后使用如下,但是報錯 UnsupportOperationException.... 根據提示信息,就是調用add()方法時拋出了異常。順著堆棧信息往上找,提示的是AbstractList類的108行出了異常,這一行所在方法的具體實現如下: //108行 …

[分享] 精神崩潰的老鼠

李國棟床上堆著書,每天晚上睡在榻榻米上,讀書讀到凌晨一兩點,讀到兩眼充血,像針扎一樣痛苦,才把書放開。蜷縮到榻榻米上,用繩子把左腿跟一只桌腳綁在一起,熄了燈睡覺。 “這樣一來&#xff0…

(七)整合spring cloud云服務架構 - common-service 項目構建過程

我們將對common-service整個項目進行剖析,將整個構建的流程給記錄下來,讓更多的關注者來參考學習。首先在構建spring cloud的common-service之前,我們需要準備的技術:Maven(項目構建)、Spring Boot、Spring…

python list元素合并_python list 合并連接字符串的方法

python list 合并連接字符串的方法 更新時間:2013年03月09日 22:02:18 作者: python 列表合并字符串,我們一般會用到字符串的join方法來操作。下面通過代碼的形式,詳細的說下list怎么拼成字符串? 相關文章這篇文章主要…

修改citrix 默認偵聽端口的命令和XML Service端口

修改citrix 默認偵聽端口的命令: 在命令行下輸入icaport /port:2494,或你所想改成的端口 如果輸入 icaport /reset 恢復默認偵聽端口 ctxxmlss /r8080 在citrix的外部客戶端通過web方式登陸時,提示“the alternate address cannot…

spfa算法

1 轉載于:https://www.cnblogs.com/Emcikem/p/11346073.html

集成方法-概念理解

集成方法(ensemble method)又叫元算法(meta-algorithm):將不同的分類器組合起來。 通俗的說:就是三個臭皮匠賽過諸葛亮。做決定時,考慮多個人的意見,不是一個人的意見 集成方法&…

單片機按鍵防抖程序_這些單片機按鍵設計方案,請拿好,不謝!

在單片機系統里,按鍵是常見的輸入設備,在本文中介紹幾種按鍵硬件、軟件設計方面的技巧。一般的在按鍵的設計上,一般有四種方案,創客學院帶你零基礎學習電子產品設計。一是GPIO口直接檢測單個按鍵,如圖1.1所示;二是按鍵…

Oracle 11G 安裝詳解

oracle官網下載地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 官網下載需要注冊orcale賬號,比較繁瑣,這里直接放已經下載好的安裝包鏈接 Oracle11G下載鏈接: https://pan.baidu.com/s/1v6oD4jAt…

程序員何苦為難程序員?

有時候想想程序員為何為難程序員呢? 扳扳手指走上碼農這個行業也有幾年了,但是越來越覺得這個行業很累,有人說程序員就是二代農民工,我個人還是比較贊同的,對于剛入道的同仁們來說確實就是個體力(腦力,眼力…

kubeadm部署k8s_用 kubeadm 部署生產級 k8s 集群

概述kubeadm 已?持集群部署,且在1.13 版本中 GA,?持多 master,多 etcd 集群化部署,它也是官?最為推薦的部署?式,?來是由它的 sig 組來推進的,?來 kubeadm 在很多??確實很好的利?了 kubernetes 的許…

poj 題目分類

1000 AB Problem 送分題 1001 Exponentiation 高精度 1003 Hangover 送分題 1004 Financial Management 送分題 1005 I Think I Need a Houseboat 幾何 1006 Biorhythms 送分題 1007 …

模板的語法

我已經碰到過好幾次這種錯誤了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

統計學習方法概論---分類問題

為什么80%的碼農都做不了架構師&#xff1f;>>> 分類問題 轉載于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增強性插件)

用Vista好長好長時間了&#xff0c;除了比較吃硬件、老的游戲不兼容、我350W像素的老羅技不能用等等&#xff0c;感覺不是非常不錯的。IE 7也還可以&#xff0c;后來我試用了傲游、火狐&#xff0c;在多標簽后傲游的一些操作更人性化&#xff0c;我最喜歡它的托拉即可自動出新標…

CENTOS7 Python3.7 PyAudio 安裝

2019獨角獸企業重金招聘Python工程師標準>>> 出現錯誤: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循環_Bash 中的 For 循環

循環是編程語言的基本概念之一。當你想要一遍又一遍地運行一系列命令直到達到某個條件后終止退出時&#xff0c;循環很方便。在諸如 Bash 之類的腳本語言中&#xff0c;循環對于自動執行重復性任務非常有用。在 Bash 腳本中有3個基本的循環結構&#xff0c;for 循環&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 轉載于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html

軟件工程師的6年總結

“又是一年畢業時”&#xff0c;看到一批批學子離開人生的象牙塔&#xff0c;走上各自的工作崗位&#xff1b;想想自己也曾經意氣風發、躊躇滿志&#xff0c;不覺感嘆萬千……本文是自己工作6年的經歷沉淀或者經驗提煉&#xff0c;希望對所有的軟件工程師們有所幫助&#xff0c…