數(shù)據(jù)挖掘課程作業(yè)作業(yè)1
計科210X 甘晴void 202108010XXX
第一題
假設(shè)所分析的數(shù)據(jù)包括屬性 age,它在數(shù)據(jù)元組中的值(以遞增序)為13 ,15 ,16 ,16 ,19 ,20 ,20 ,21 ,22 ,22 ,25 ,25 ,25 ,25 ,30 ,33 ,33 ,35 ,35 ,35 ,35 ,36 ,40 ,45 ,46 ,52,70。
- a. 該數(shù)據(jù)的均值是多少?中位數(shù)是什么?
- b. 該數(shù)據(jù)的眾數(shù)是什么?討論數(shù)據(jù)的模態(tài)(即二模、三模等)。
- c. 該數(shù)據(jù)的中列數(shù)是多少?
- d. 你能(粗略地)找出該數(shù)據(jù)的第一個四分位數(shù)(Q1)和第三個四分位數(shù)(Q3)嗎?
- e. 給出該數(shù)據(jù)的五數(shù)概括。
- f. 繪制該數(shù)據(jù)的盒圖。
- g. 分位數(shù)-分位數(shù)圖與分位數(shù)圖有何不同?
解:
a. 該數(shù)據(jù)的均值是多少?中位數(shù)是什么?
均值:809/27=29.96
中位數(shù):25
b. 該數(shù)據(jù)的眾數(shù)是什么?討論數(shù)據(jù)的模態(tài)(即二模、三模等)。
眾數(shù)是 25 和 35,它們都出現(xiàn)了 4 次。
這個數(shù)據(jù)集是二模的,有兩個眾數(shù),即兩個峰態(tài),因此是雙峰眾數(shù)。
c. 該數(shù)據(jù)的中列數(shù)是多少?
中列數(shù):極大值與極小值的平均
極大值:70 極小值:13
中列數(shù):(70+13)/2=41.5
d. 你能(粗略地)找出該數(shù)據(jù)的第一個四分位數(shù)(Q1)和第三個四分位數(shù)(Q3)嗎?
四分位數(shù):將數(shù)據(jù)集分成四等分的值。
Q1 表示數(shù)據(jù)的第 25% 位置處的值,而 Q3 表示數(shù)據(jù)的第 75% 位置處的值。
第一個四分位數(shù)為[27/4]=7處,Q1=20,;第三個四分位數(shù)為21處,Q3=35。
e. 給出該數(shù)據(jù)的五數(shù)概括。
五數(shù)概括包括最小值、第一四分位數(shù)(Q1)、中位數(shù)、第三四分位數(shù)(Q3)和最大值。
最小值:13
Q1(第一個四分位數(shù)):20
中位數(shù):25
Q3(第三個四分位數(shù)):35
最大值:70
f. 繪制該數(shù)據(jù)的盒圖。
#python代碼如下
import matplotlib.pyplot as plt
data = [13, 15, 16, 16, 19, 20, 20, 21, 22, 22, 25, 25, 25, 25, 30, 33, 33, 35, 35, 35, 35, 36, 40, 45, 46, 52, 70]
plt.boxplot(data)
plt.title('Box Plot of the Data')
plt.show()
繪制圖像如下:
g. 分位數(shù)-分位數(shù)圖與分位數(shù)圖有何不同?
簡單來說,
分位數(shù)圖是一種觀察單變量數(shù)據(jù)分布的簡單有效分發(fā)(就是上面給出的箱型圖)。首先它顯示給定屬性的所有數(shù)據(jù)的分布情況;其次它給出了分位數(shù)信息。
分位數(shù)-分位數(shù)圖則是反映了同一個屬性的不同樣本的數(shù)據(jù)分布情況,使得用戶可以很方便地比較這兩個樣本之間的區(qū)別或聯(lián)系。
具體地說,
分位數(shù)圖是一種用來展示數(shù)據(jù)值低于或等于在一個單變量分布中獨立的變量的粗略百分比。這樣,他可以展示所有數(shù)的分位數(shù)信息,而為獨立變量測得的值(縱軸)相對于它們的分位數(shù)(橫軸)被描繪出來。
分位數(shù)-分位數(shù)圖用縱軸表示一種單變量分布的分位數(shù),用橫軸表示另一單變量分布的分位數(shù)。兩個坐標(biāo)軸顯示它們的測量值相應(yīng)分布的值域,且點按照兩種分布分位數(shù)值展示。
舉例來說,一條線(y=x)可畫到圖中+以增加圖像的信息。落在該線以上的點表示在y軸上顯示的值的分布比x軸的相應(yīng)的等同分位數(shù)對應(yīng)的值的分布高。反之,對落在該線以下的點來說,則低。
以下是簡單實現(xiàn)觀測值和正態(tài)分布對比的QQ圖(僅僅作為練習(xí)使用)
#python代碼
import scipy.stats as stats
import matplotlib.pyplot as plt
data = [13, 15, 16, 16, 19, 20, 20, 21, 22, 22, 25, 25, 25, 25, 30, 33, 33, 35, 35, 35, 35, 36, 40, 45, 46, 52, 70]
# 計算標(biāo)準(zhǔn)正態(tài)分布的分位數(shù)
theoretical_quantiles = stats.norm.ppf([(i - 0.5) / len(data) for i in range(1, len(data) + 1)])
# 計算數(shù)據(jù)集的分位數(shù)
sample_quantiles = sorted(data)
plt.scatter(theoretical_quantiles, sample_quantiles)
plt.xlabel('Theoretical Quantiles')
plt.ylabel('Sample Quantiles')
plt.title('Q-Q Plot')
plt.show()
繪制圖像如下:
第二題
在數(shù)據(jù)分析中,重要的選擇相似性度量。然而,不存在廣泛接受的主觀相似性度量,結(jié)果可能因所用的相似性度量而異。雖然如此,在進(jìn)行某種變換后,看來似乎不同的相似性度量可能等價。
假設(shè)我們有如下二維數(shù)據(jù)集:
A1 | A2 | |
---|---|---|
X1 | 1.5 | 1.7 |
X2 | 2 | 1.9 |
X3 | 1.6 | 1.8 |
X4 | 1.2 | 1.5 |
X5 | 1.5 | 1.0 |
- a. 把該數(shù)據(jù)看做二維數(shù)據(jù)點。給定一個新的數(shù)據(jù)點x=(1.4,1.6) 作為查詢點,使用歐幾里得距離、曼哈頓距離、上確界距離和余弦相似性,基于查詢點的相似性對數(shù)據(jù)庫的點排位。
- b. 規(guī)格化該數(shù)據(jù)集,使得每個數(shù)據(jù)點的范數(shù)等于 1。在變換后的數(shù)據(jù)上使用歐幾里得距離對諸數(shù)據(jù)點排位。
解:
a.計算四種距離并給出各自排名
首先需要了解這幾個距離都是怎么計算的
- 歐幾里得距離:d=sqrt[(x1-x2)2+(y1-y2)2],即平面直角坐標(biāo)系上兩點間距離
- 曼哈頓距離:d=|x1-x2|+|y1-y2|
- 上確界距離:d=max(|x1-x2|,|y1-y2|)
- 余弦相似性:d=(A·B)/(||A||·||B||),A,B分別為原點指向兩個點的向量
使用以下python代碼實現(xiàn)進(jìn)行計算與排序
import numpy as np
# 數(shù)據(jù)集
data = np.array([[1.5, 1.7],
[2.0, 1.9],
[1.6, 1.8],
[1.2, 1.5],
[1.5, 1.0]])
# 查詢點
query_point = np.array([1.4, 1.6])
# a. 使用不同相似性度量對數(shù)據(jù)點進(jìn)行排名
# 歐幾里得距離
euclidean_distances = np.sqrt(np.sum((data - query_point) ** 2, axis=1))
euclidean_ranking = np.argsort(euclidean_distances)
# 曼哈頓距離
manhattan_distances = np.sum(np.abs(data - query_point), axis=1)
manhattan_ranking = np.argsort(manhattan_distances)
# 上確界距離
supremum_distances = np.max(np.abs(data - query_point), axis=1)
supremum_ranking = np.argsort(supremum_distances)
# 余弦相似性
cosine_similarities = np.dot(data, query_point) / (np.linalg.norm(data, axis=1) * np.linalg.norm(query_point))
cosine_ranking = np.argsort(cosine_similarities)[::-1] # 使用負(fù)值排名,因為余弦相似性越大越相似
# 計算值
print("歐幾里得距離計算值:", euclidean_distances)
print("曼哈頓距離計算值:", manhattan_distances)
print("上確界距離計算值:", supremum_distances)
print("余弦相似性計算值:", cosine_similarities)
# 打印排名結(jié)果
print("歐幾里得距離排名:", euclidean_ranking + 1) # 加1以匹配數(shù)據(jù)點的索引
print("曼哈頓距離排名:", manhattan_ranking + 1)
print("上確界距離排名:", supremum_ranking + 1)
print("余弦相似性排名:", cosine_ranking + 1)
結(jié)果如下:
E:\anaconda\envs\python3-11\python.exe E:\python_files\數(shù)據(jù)挖掘\homework1\homework1-2.py
歐幾里得距離計算值: [0.14142136 0.67082039 0.28284271 0.2236068 0.60827625]
曼哈頓距離計算值: [0.2 0.9 0.4 0.3 0.7]
上確界距離計算值: [0.1 0.6 0.2 0.2 0.6]
余弦相似性計算值: [0.99999139 0.99575226 0.99996948 0.99902823 0.96536339]
歐幾里得距離排名: [1 4 3 5 2]
曼哈頓距離排名: [1 4 3 5 2]
上確界距離排名: [1 4 3 2 5]
余弦相似性排名: [1 3 4 2 5]
整理與繪制表格
X1 | X2 | X3 | X4 | X5 | |
---|---|---|---|---|---|
歐幾里得距離 | 0.14 | 0.67 | 0.28 | 0.22 | 0.61 |
曼哈頓距離 | 0.2 | 0.9 | 0.4 | 0.3 | 0.7 |
上確界距離 | 0.1 | 0.6 | 0.2 | 0.2 | 0.6 |
余弦相似性 | 0.99999139 | 0.99575226 | 0.99996948 | 0.99902823 | 0.99902823 |
排序結(jié)果 | |
---|---|
歐幾里得距離 | X1 < X4 < X3 < X5 < X2 |
曼哈頓距離 | X1 < X4 < X3 < X5 < X2 |
上確界距離 | X1 < X4 < X3 < X2 < X5 |
余弦相似性 | X1 > X3 > X4 > X2 > X5 |
注意余弦相似性計算結(jié)果越大表示越相似。
b.規(guī)格化數(shù)據(jù)集并在變換后重新用歐幾里得距離排序
操作如下:
- 計算每個數(shù)據(jù)點的范數(shù)(歐幾里得距離)
- 將每個數(shù)據(jù)點除以其范數(shù),以規(guī)格化數(shù)據(jù)點
- 使用規(guī)格化后的數(shù)據(jù)集計算歐幾里得距離并對數(shù)據(jù)點進(jìn)行排名
可以使用python實現(xiàn)如上過程
import numpy as np
# 數(shù)據(jù)集
data = np.array([[1.5, 1.7],
[2.0, 1.9],
[1.6, 1.8],
[1.2, 1.5],
[1.5, 1.0]])
# 計算每個數(shù)據(jù)點的范數(shù)
norms = np.linalg.norm(data, axis=1)
# 規(guī)格化數(shù)據(jù)集
normalized_data = data / norms[:, np.newaxis]
# 查詢點,需要進(jìn)行規(guī)格化
query_point = np.array([1.4, 1.6])
# 規(guī)格化查詢點
query_point_norm = np.linalg.norm(query_point)
normalized_query_point = query_point / query_point_norm
# 使用歐幾里得距離對規(guī)格化后的數(shù)據(jù)點進(jìn)行排名
euclidean_distances = np.linalg.norm(normalized_data - normalized_query_point, axis=1)
euclidean_ranking = np.argsort(euclidean_distances)
# 打印歐幾里得距離計算值和排名
print("歐幾里得距離計算值:", euclidean_distances)
print("歐幾里得距離排名:", euclidean_ranking + 1) # 加1以匹配數(shù)據(jù)點的索引
運行結(jié)果如下:
E:\anaconda\envs\python3-11\python.exe E:\python_files\數(shù)據(jù)挖掘\homework1\homework1-2b.py
歐幾里得距離計算值: [0.00414935 0.09217091 0.00781232 0.04408549 0.26319805]
歐幾里得距離排名: [1 3 4 2 5]
X1 | X2 | X3 | X4 | X5 | |
---|---|---|---|---|---|
規(guī)格化后的歐幾里得距離 | 0.0041 | 0.0922 | 0.0078 | 0.0441 | 0.2632 |
排序結(jié)果:X1 < X3 < X4 < X2 < X5
第三題
使用如下方法規(guī)范化如下數(shù)組:
200,300,400,600,1000
- a. 令 min=0,max=1,最小—最大規(guī)范化。
- b. z 分?jǐn)?shù)規(guī)范化。
- c. z 分?jǐn)?shù)規(guī)范化,使用均值絕對偏差而不是標(biāo)準(zhǔn)差。
- d. 小數(shù)定標(biāo)規(guī)范化。
解:
首先了解這四種數(shù)據(jù)規(guī)范化的方法的操作步驟
- 最小-最大規(guī)范化:
- 解釋:將數(shù)據(jù)縮放到一個指定的范圍,通常是[0, 1]。
- 計算方法:對于每個數(shù)據(jù)點X,使用以下公式進(jìn)行規(guī)范化: X=[X-min(X)]/[max(X)-min(X)]
- 意義:這種方法確保了所有數(shù)據(jù)都位于指定的范圍內(nèi),其中最小值映射為0,最大值映射為1。
- z 分?jǐn)?shù)規(guī)范化:
- 解釋:將數(shù)據(jù)映射為均值為0,標(biāo)準(zhǔn)差為1的正態(tài)分布(z 分?jǐn)?shù)分布)。
- 計算方法:對于每個數(shù)據(jù)點X,使用以下公式進(jìn)行規(guī)范化: X=(X-μ)/σ,其中μ為均值,σ為標(biāo)準(zhǔn)差
- 意義:這種方法適用于數(shù)據(jù)分布近似正態(tài)分布的情況,可以使數(shù)據(jù)更容易進(jìn)行比較和分析。
- z 分?jǐn)?shù)規(guī)范化(使用均值絕對偏差而不是標(biāo)準(zhǔn)差):
- 解釋:將數(shù)據(jù)映射為均值為0,均值絕對偏差為1的分布。
- 計算方法:: X=(X-μ)/MAD,其中μ為均值,MAD為均值絕對偏差,MAD=(1/n)[Σ|xi-μ|]
- 意義:均值絕對偏差是數(shù)據(jù)點到均值的絕對距離的均值,與標(biāo)準(zhǔn)差不同。這種方法在數(shù)據(jù)中存在離群值(異常值)的情況下更穩(wěn)健。
- 小數(shù)定標(biāo)規(guī)范化:
- 解釋:通過移動小數(shù)點,將數(shù)據(jù)映射到[-1, 1]或其他合適的范圍。
- 計算方法:找到數(shù)據(jù)中的最大絕對值,然后計算一個縮放因子,通常是10的冪,以便將最大絕對值縮放到1之下。然后,將所有數(shù)據(jù)點除以這個縮放因子。
- 意義:這種方法將數(shù)據(jù)點縮放到[-1, 1]或[-0.1, 0.1]等范圍內(nèi),使數(shù)據(jù)易于理解和比較。這里我選取的是[-1,1]
不同的規(guī)范化方法適用于不同的數(shù)據(jù)和分析場景。您可以根據(jù)數(shù)據(jù)的性質(zhì)和分析要求選擇適當(dāng)?shù)囊?guī)范化方法。
使用python代碼實現(xiàn)
#給定數(shù)據(jù)
data = [200, 300, 400, 600, 1000]
# 最小-最大規(guī)范化
min_val = min(data)
max_val = max(data)
normalized_data = [(x - min_val) / (max_val - min_val) for x in data]
#print(normalized_data)
print([round(val, 2) for val in normalized_data]) # 保留兩位小數(shù)
# z 分?jǐn)?shù)規(guī)范化,使用標(biāo)準(zhǔn)差
import statistics
mean = statistics.mean(data)
std_dev = statistics.stdev(data)
z_scores = [(x - mean) / std_dev for x in data]
#print(z_scores)
print([round(val, 2) for val in z_scores]) # 保留兩位小數(shù)
# z 分?jǐn)?shù)規(guī)范化,使用均值絕對偏差
def mean_absolute_deviation(data):
mean = sum(data) / len(data)
deviation = [abs(x - mean) for x in data]
return sum(deviation) / len(deviation)
mad = mean_absolute_deviation(data)
normalized_data = [(x - statistics.mean(data)) / mad for x in data]
#print(normalized_data)
print([round(val, 2) for val in normalized_data])
# 小數(shù)定標(biāo)規(guī)范化
max_val = max(data)
num_digits = len(str(max_val))
scaled_data = [x / (max_val) for x in data]
#print(scaled_data)
print([round(val, 2) for val in scaled_data]) # 保留兩位小數(shù)
結(jié)果如下:
E:\anaconda\envs\python3-11\python.exe E:\python_files\數(shù)據(jù)挖掘\homework1\homework1-3.py
[0.0, 0.12, 0.25, 0.5, 1.0]
[-0.95, -0.63, -0.32, 0.32, 1.58]
[-1.25, -0.83, -0.42, 0.42, 2.08]
[0.2, 0.3, 0.4, 0.6, 1.0]
繪制表格如下
X1 | X2 | X3 | X4 | X5 | |
---|---|---|---|---|---|
最小-最大規(guī)范化 | 0.0 | 0.12 | 0.25 | 0.5 | 1.0 |
z 分?jǐn)?shù)規(guī)范化(標(biāo)準(zhǔn)差) | -0.95 | -0.63 | -0.32 | -0.32 | 1.58 |
z 分?jǐn)?shù)規(guī)范化(均值絕對偏差) | -1.25 | -0.83 | -0.42 | 0.42 | 2.08 |
小數(shù)定標(biāo)規(guī)范化 | 0.2 | 0.3 | 0.4 | 0.6 | 1.0 |
第四題
假設(shè) 12 個銷售價格記錄已經(jīng)排序,如下所示:
5,10,11,13,15,35,50,55,72,92,204,215
使用如下各方法將它們劃分成三個箱。
- a. 等頻(等深)劃分。
- b. 等寬劃分。
- c. 聚類。
解:
a. 等頻(等深)劃分:
等頻劃分將數(shù)據(jù)集分成相等數(shù)量的箱,每個箱中包含近似相等數(shù)量的數(shù)據(jù)點。
- 首先,計算數(shù)據(jù)集的總數(shù),即 12。
- 然后,計算每個箱的大小,即 12 / 3 = 4。
- 從最小值5開始,將數(shù)據(jù)點按順序放入箱中,直到每個箱包含4個數(shù)據(jù)點為止。
劃分后的三個箱分別是:文章來源:http://www.zghlxwxcb.cn/news/detail-814598.html
- 箱1: [5, 10, 11, 13]
- 箱2: [15, 35, 50, 55]
- 箱3: [72, 92, 204, 215]
b. 等寬劃分:
等寬劃分將數(shù)據(jù)集分成包含相等數(shù)值范圍的箱。
- 首先,找到數(shù)據(jù)集的最小值(5)和最大值(215)。
- 計算數(shù)值范圍,即 215 - 5 = 210。
- 將數(shù)值范圍除以3,以確定每個箱的寬度,即 210 / 3 = 70。
- 從最小值開始,創(chuàng)建三個箱,每個箱的寬度為70。
- 第一個箱,5-75;第二個箱,75-145;第三個箱,145-215
劃分后的三個箱分別是:
- 箱1: [5, 10, 11, 13, 15, 35, 50, 55, 72]
- 箱2: [92]
- 箱3: [204, 215]
c. 聚類:
聚類方法:使用聚類算法來將數(shù)據(jù)點分成組。使用 k-means 聚類方法,將數(shù)據(jù)點劃分成三個簇。這個過程需要計算簇的中心點,然后將每個數(shù)據(jù)點分配到離它最近的中心點所屬的簇。
本題由于數(shù)據(jù)只有一個維度,故沒有必要進(jìn)行標(biāo)準(zhǔn)化,也可以進(jìn)行標(biāo)準(zhǔn)化,但是實際測試沒有改變結(jié)果(符合預(yù)期)。
在Python中,可以使用sklearn
庫來執(zhí)行 k-means 聚類。使用以下代碼實現(xiàn)。
from sklearn.cluster import KMeans
import numpy as np
from sklearn.preprocessing import StandardScaler
data = np.array([5, 10, 11, 13, 15, 35, 50, 55, 72, 92, 204, 215])
data = data.reshape(-1, 1) # 將數(shù)據(jù)轉(zhuǎn)換為一列
# 標(biāo)準(zhǔn)化數(shù)據(jù)
# scaler = StandardScaler()
# data = scaler.fit_transform(data)
kmeans = KMeans(n_clusters=3, algorithm='lloyd').fit(data)
print(kmeans)
labels = kmeans.labels_
# 根據(jù)標(biāo)簽將數(shù)據(jù)點分為三個簇
cluster1 = data[labels == 0]
cluster2 = data[labels == 1]
cluster3 = data[labels == 2]
print("簇1:", cluster1)
print("簇2:", cluster2)
print("簇3:", cluster3)
# 打印每個簇的中心點位置
centers = kmeans.cluster_centers_
print("簇1 中心點:", centers[0])
print("簇2 中心點:", centers[1])
print("簇3 中心點:", centers[2])
這將使用 k-means 聚類將數(shù)據(jù)點劃分成三個簇。在示例代碼中,cluster1
、cluster2
和 cluster3
包含了每個簇的數(shù)據(jù)點。
劃分后的三個箱分別是:
- 箱1: [5, 10, 11, 13, 15, 35]
- 箱2: [50, 55, 72, 92]
- 箱3: [204, 215]
這三個簇的中心點分別為文章來源地址http://www.zghlxwxcb.cn/news/detail-814598.html
- 14.833
- 67.25
- 209.5
到了這里,關(guān)于HNU-數(shù)據(jù)挖掘-作業(yè)1的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!