Hw1
1
( a )
- 均值: 29.963 29.963 29.963
- 中位数: 25 25 25
( b )
- 众数: 25 、 35 25、35 25、35
- 双峰分布,即二模
( c )
- 中列数: 70 + 13 2 = 41.5 \frac{70 + 13}{2} = 41.5 270+13=41.5
( d )
- 第一个四分位数: ⌈ 27 4 ⌉ = 7 \lceil \frac{27}{4} \rceil = 7 ⌈427⌉=7 处, Q 1 : 20 Q_1 : 20 Q1:20
- 第三个四分位数为: 7 × 3 = 21 7×3=21 7×3=21 处, Q 3 : 35 Q_3 : 35 Q3:35
( e )
- 最小值: 13 13 13
- Q1: 20 20 20
- 中位数: 25 25 25
- Q3: 35 35 35
- 最大值: 70 70 70
( f )
( g )
- 分位数-分位数图是散点图,主要用于反映同一 属性的不同样本的数据分布情况,以观察从一个分布到另一个分布数据之间的联系。
- 分位数图用于观察单个变量的数据分布,用于展示数据的分布和离群值情况。
2
N = 200 + 450 + 300 + 1500 + 700 + 44 = 3194 N = 200 + 450 + 300 + 1500 + 700 + 44 = 3194 N=200+450+300+1500+700+44=3194
N 2 = 1597 \frac{N}{2} = 1597 2N=1597
所以,中位数区间为 21 21 21 ~ 50 50 50
有:
L
1
=
21
L_1 = 21
L1=21
(
Σ
f
r
e
q
)
l
=
300
+
450
+
200
=
950
(\Sigma freq)_l = 300 + 450 + 200 = 950
(Σfreq)l=300+450+200=950
f
r
e
q
m
e
d
i
a
n
=
1500
freq_{median} = 1500
freqmedian=1500
w
i
d
t
h
=
30
width = 30
width=30
根据插值计算:
m e d i a n = L 1 + ( N 2 + ( Σ f r e q ) l f r e q m e d i a n ) w i d t h = 33.94 median = L_1 + (\frac{\frac{N}{2} + (\Sigma freq)_l}{freq_{median}}) width = 33.94 median=L1+(freqmedian2N+(Σfreq)l)width=33.94
3
( a )
-
age
平均值: 46.444 46.444 46.444
中位数: 51 51 51
标准差: 13.219 13.219 13.219 -
%fat
平均值: 28.783 28.783 28.783
中位数: 30.7 30.7 30.7
标准差: 9.254 9.254 9.254
( b )
( c )
4
( a )
- 欧几里得距离: 6.708 6.708 6.708
( b )
- 曼哈顿距离: 11 11 11
( c )
- 闵可夫斯基距离: 6.153 6.153 6.153
( d )
- 上确界距离: 6 6 6
5
( a )
- 欧几里得: x 1 x_1 x1 x 4 x_4 x4 x 3 x_3 x3 x 5 x_5 x5 x 2 x_2 x2
- 曼哈顿距离: x 1 x_1 x1 x 4 x_4 x4 x 3 x_3 x3 x 5 x_5 x5 x 2 x_2 x2
- 上确界距离: x 1 x_1 x1 x 4 x_4 x4 x 3 x_3 x3 x 5 x_5 x5 x 2 x_2 x2
- 余弦相似性: x 1 x_1 x1 x 3 x_3 x3 x 4 x_4 x4 x 2 x_2 x2 x 5 x_5 x5
( b )
规格化后的数据为:
x 1 x_1 x1 ( 0.6616 , 0.7498 ) (0.6616, 0.7498) (0.6616,0.7498)
x 2 x_2 x2 ( 0.7250 , 0.6887 ) (0.7250,0.6887) (0.7250,0.6887)
x 3 x_3 x3 ( 0.6644 , 0.7474 ) (0.6644,0.7474) (0.6644,0.7474)
x 4 x_4 x4 ( 0.6247 , 0.7089 ) (0.6247,0.7089) (0.6247,0.7089)
x 5 x_5 x5 ( 0.8321 , 0.5547 ) (0.8321,0.5547) (0.8321,0.5547)
排序为: x 1 x_1 x1 x 3 x_3 x3 x 4 x_4 x4 x 2 x_2 x2 x 5 x_5 x5
6
# hw1-6.py
import numpy as np
import matplotlib.pyplot as plt
def simulate_sampling_prob(num_clusters, sample_sizes, num_simulations):
results = []
for sample_size in sample_sizes:
success_count = 0
for _ in range(num_simulations):
# 生成随机的簇标签
clusters = np.random.randint(0, num_clusters, size=sample_size)
# 确定包含的独特簇标签
unique_clusters = np.unique(clusters)
# 如果包含了所有簇,则计数加1
if len(unique_clusters) == num_clusters:
success_count += 1
# 计算成功概率并添加到结果列表中
success_prob = success_count / num_simulations
results.append(success_prob)
return results
# 设置参数
num_clusters = 10
sample_sizes = range(0, 70, 1)
num_simulations = 1000
# 模拟抽样概率
probabilities = simulate_sampling_prob(num_clusters, sample_sizes, num_simulations)
# 绘制折线图
plt.plot(sample_sizes, probabilities)
plt.xlabel('Sample Size')
plt.ylabel('Probability')
plt.title('Sampling Probability of Obtaining at least one representative from each cluster')
plt.show()
结果图:
7
( a )
汉明距离:
3
3
3
Jaccard相似度:
0.4
0.4
0.4
( b )
- Jaccard相似度更类似于简单匹配系数,重视两个向量中相同元素的比例。
- 汉明距离更类似于余弦度量,度量它们之间的相似性。
( c )
Jaccard相似度更适用。
因为需要匹配两者都均有的基因来比较有机体的相似性。而汉明距离只考虑二进位的差异,使用Jaccard相似度则可以计算两个有机体之间共同基因的比例,从而比较它们的相似性。
( d )
汉明距离更适用。
构成相同物种的两个有机体的基因相似性非常高,汉明距离可以有效地捕捉到二进位差异的数量,着重两者不同的基因。
8
( a )
- 余弦: 1 1 1
- 相关: 0 / 0 0/0 0/0
- 欧几里得: 2 2 2
( b )
- 余弦: 0 0 0
- 相关: − 1 -1 −1
- 欧几里得: 2 2 2
- Jaccard: 0 0 0
( c )
- 余弦: 0 0 0
- 相关: 0 0 0
- 欧几里得: 2 2 2
( d )
- 余弦: 0.75 0.75 0.75
- 相关: 0.25 0.25 0.25
- Jaccard: 0.6 0.6 0.6
( e )
- 余弦: 0 0 0
- 相关: 0 0 0
9
满足度量公式的三个性质:非负性、同一性和三角不等式
-
非负性:
s i z e ( A − B ) size(A - B) size(A−B) 和 s i z e ( B − A ) size(B - A) size(B−A) 均非负
所以 d ( A , B ) = s i z e ( A − B ) + s i z e ( B − A ) ≥ 0 d ( A , B ) = size(A - B) + size(B - A) \geq 0 d(A,B)=size(A−B)+size(B−A)≥0 -
同一性:
当 A = B A = B A=B 时
s i z e ( A − B ) size(A - B) size(A−B) 和 s i z e ( B − A ) size(B - A) size(B−A) 均为 0 0 0
所以 d ( A , B ) = 0 d(A, B) = 0 d(A,B)=0 -
三角不等式:
因为 d ( A , B ) = s i z e ( A ) + s i z e ( B ) − 2 s i z e ( A ∩ B ) d( A , B) = size(A) + size(B) - 2size(A ∩ B) d(A,B)=size(A)+size(B)−2size(A∩B)
所以有 d ( A , B ) + d ( B , C ) = s i z e ( A ) + s i z e ( C ) + 2 s i z e ( B ) − 2 s i z e ( A ∩ B ) − 2 s i z e ( B ∩ C ) d(A , B) + d(B , C) = size(A) + size(C) + 2size(B) - 2size(A ∩ B) - 2size(B ∩ C) d(A,B)+d(B,C)=size(A)+size(C)+2size(B)−2size(A∩B)−2size(B∩C)
又有 s i z e ( A ∩ B ) ≤ s i z e ( B ) , s i z e ( B ∩ C ) ≤ s i z e ( B ) size(A ∩ B) ≤ size(B),size(B ∩ C) ≤ size(B) size(A∩B)≤size(B),size(B∩C)≤size(B)
所以 d ( A , B ) + d ( B , C ) ≥ s i z e ( A ) + s i z e ( C ) + 2 s i z e ( B ) − 2 s i z e ( B ) = s i z e ( A ) + s i z e ( C ) ≥ s i z e ( A ) + s i z e ( C ) − 2 s i z e ( A ∩ C ) = d ( A , C ) \begin{aligned}d(A , B) + d(B , C) &≥ size(A) + size(C) + 2size(B) - 2size(B) \\&= size(A) + size(C) ≥ size(A) + size(C) - 2size(A ∩ C) \\&= d(A , C)\end{aligned} d(A,B)+d(B,C)≥size(A)+size(C)+2size(B)−2size(B)=size(A)+size(C)≥size(A)+size(C)−2size(A∩C)=d(A,C)
证明三角不等式成立
综上所述, d ( A , B ) = s i z e ( A − B ) + s i z e ( B − A ) d(A, B) = size(A - B) + size(B - A) d(A,B)=size(A−B)+size(B−A)满足度量公理。
10
( a )
d ( y , z ) ≤ d ( y , x ) + d ( x , z ) d( y , z ) \leq d( y , x ) + d( x , z ) d(y,z)≤d(y,x)+d(x,z)
若 d ( x , y ) ≤ ϵ 2 , d ( x , z ) ≤ ϵ 2 d( x , y ) \leq \frac{\epsilon}{2},d( x , z ) \leq \frac{\epsilon}{2} d(x,y)≤2ϵ,d(x,z)≤2ϵ
则 d ( y , z ) d( y , z ) d(y,z) 不必计算
d ( y , z ) ≥ d ( y , x ) − d ( x , z ) d( y , z ) \geq d( y , x ) - d( x , z ) d(y,z)≥d(y,x)−d(x,z)
若 d ( y , x ) − d ( x , z ) ≥ ϵ d( y , x ) - d( x , z ) \geq \epsilon d(y,x)−d(x,z)≥ϵ
则 d ( y , z ) d( y , z ) d(y,z) 不必计算
( b )
若
x
,
y
x, y
x,y 之间距离为
0
0
0,则不需其他计算。
若
x
x
x 与
y
y
y 距离较大,则需要计算更多点
y
y
y 到其他点的距离。
( c )
记
x
,
y
x,y
x,y 是
S
′
S'
S′ 里的点,
x
0
x_0
x0 和
y
0
y_0
y0 是
S
′
S'
S′ 里距离
x
,
y
x,y
x,y 最近的点。
若
d
(
x
0
,
y
0
)
+
2
ϵ
≤
β
d( x_0 , y_0 ) + 2\epsilon \leq β
d(x0,y0)+2ϵ≤β,则
d
(
x
,
y
)
≤
β
d( x , y ) \leq \beta
d(x,y)≤β
若
d
(
x
0
,
y
0
)
−
2
ϵ
≤
β
d( x_0 , y_0 ) - 2\epsilon \leq β
d(x0,y0)−2ϵ≤β,则
d
(
x
,
y
)
≥
β
d( x , y ) \geq \beta
d(x,y)≥β
11
(见补充)
12
( a )
- 对数据进行排列
- 将以上数据划分为深度为3的箱
- 计算每个等频箱的算数均值
- 将箱中的值替换为计算得到的均值
这种方法可以减少原始数据的噪声和波动,光滑数据,使趋势更加明显。但对数据点的改变导致每个数据的含义发生了变化,可能会与数据本身偏离。
( b )
可以通过聚类来检测数据中的异常值,落在聚类集之外的值可以被认为是离群值。 也可以通过训练好的机器或人工进行筛查。
( c )
可以通过箱中值光滑、箱边界光滑、线性回归等方法。
13
( a )
人为设定的最小-最大区间,即 [ m i n ′ , m a x ′ ] [min',max'] [min′,max′]
( b )
[ v m i n − A ˉ σ A , v m a x − A ˉ σ A ] [\frac{v_{min} - \bar{A}}{\sigma_A},\frac{v_{max} - \bar{A}}{\sigma_A}] [σAvmin−Aˉ,σAvmax−Aˉ]
( c )
[ v m i n − A ˉ s A , v m a x − A ˉ s A ] [\frac{v_{min} - \bar{A}}{s_A},\frac{v_{max} - \bar{A}}{s_A}] [sAvmin−Aˉ,sAvmax−Aˉ]
( d )
[ v m i n 1 0 i , v m a x 1 0 i ] [\frac{v_{min}}{10^i},\frac{v_{max}}{10^i}] [10ivmin,10ivmax]
14
( a )
规范化值 = 原始值 − 最小值 最大值 − 最小值 规范化值 = \frac{原始值 - 最小值}{最大值 - 最小值} 规范化值=最大值−最小值原始值−最小值
v
1
=
200
−
200
1000
−
200
=
0
v_1 = \frac{200 - 200}{1000 - 200} = 0
v1=1000−200200−200=0
v
2
=
300
−
200
1000
−
200
=
0.125
v_2 = \frac{300 - 200}{1000 - 200} = 0.125
v2=1000−200300−200=0.125
v
3
=
400
−
200
1000
−
200
=
0.25
v_3 = \frac{400 - 200}{1000 - 200} = 0.25
v3=1000−200400−200=0.25
v
4
=
600
−
200
1000
−
200
=
0.5
v_4 = \frac{600 - 200}{1000 - 200} = 0.5
v4=1000−200600−200=0.5
v
5
=
1000
−
200
1000
−
200
=
1
v_5 = \frac{1000 - 200}{1000 - 200} = 1
v5=1000−2001000−200=1
( b )
A
ˉ
=
(
200
+
300
+
400
+
600
+
1000
)
/
5
=
500
\bar{A} = (200 + 300 + 400 + 600 + 1000) / 5 = 500
Aˉ=(200+300+400+600+1000)/5=500
σ
A
=
282.8
\sigma_A = 282.8
σA=282.8
规范化值 = 原始值 − 均值 标准差 规范化值 = \frac{原始值 - 均值}{标准差} 规范化值=标准差原始值−均值
v
1
=
−
1.061
v_1 = -1.061
v1=−1.061
v
2
=
−
0.707
v_2 = -0.707
v2=−0.707
v
3
=
−
0.354
v_3 = -0.354
v3=−0.354
v
4
=
0.354
v_4 = 0.354
v4=0.354
v
5
=
1.768
v_5 = 1.768
v5=1.768
( c )
s A = 240 s_A = 240 sA=240
v
1
=
−
1.25
v_1 = -1.25
v1=−1.25
v
2
=
−
0.833
v_2 = -0.833
v2=−0.833
v
3
=
−
0.417
v_3 = -0.417
v3=−0.417
v
4
=
0.417
v_4 = 0.417
v4=0.417
v
5
=
2.083
v_5 = 2.083
v5=2.083
( d )
缩放因子: 1 0 3 10^3 103
v
1
=
0.2
v_1 = 0.2
v1=0.2
v
2
=
0.3
v_2 = 0.3
v2=0.3
v
3
=
0.4
v_3 = 0.4
v3=0.4
v
4
=
0.6
v_4 = 0.6
v4=0.6
v
5
=
1.0
v_5 = 1.0
v5=1.0
15
( a )
v = 35 − 13 70 − 13 = 0.386 v = \frac{35 - 13}{70 - 13} = 0.386 v=70−1335−13=0.386
( b )
A
ˉ
=
29.96
\bar{A} = 29.96
Aˉ=29.96
σ
A
=
12.94
\sigma_A = 12.94
σA=12.94
v
=
35
−
29.96
12.94
=
0.39
v = \frac{35 - 29.96}{12.94} = 0.39
v=12.9435−29.96=0.39
( c )
v = 35 100 = 0.35 v = \frac{35}{100} = 0.35 v=10035=0.35
( d )
最小-最大规范化方法。这是因为最小-最大规范化对数据的分布进行线性映射,将数据映射到指定的区间内,并且保留了数据的相对顺序。易于计算,简单直观。
16
( a )
A
ˉ
a
g
e
=
46.44
\bar{A}_{age} = 46.44
Aˉage=46.44,
σ
A
a
g
e
=
13.22
\sigma_{A_{age}} = 13.22
σAage=13.22
A
ˉ
f
a
t
=
28.78
\bar{A}_{fat} = 28.78
Aˉfat=28.78,
σ
A
f
a
t
=
9.25
\sigma_{A_{fat}} = 9.25
σAfat=9.25
-
age 规范化值:
-1.77, -1.77, -1.47, -1.47, -0.56, -0.41, 0.04, 0.19, 0.27, 0.42, 0.57, 0.57, 0.72, 0.80, 0.87, 0.87, 1.03, 1.10 -
%fat 规范化值:
-2.08, -0.25, -2.27, -1.19, 0.28, -0.31, -0.15, -0.17, 0.26, 0.63, 1.48, 0.00, 0.50, 0.15, 0.57, 0.44, 1.34, 0.75
( b )
相关系数:
0.77
0.77
0.77
两个变量正相关
协方差:
94.46
94.46
94.46
17
( a )
( b )
- 无放回简单随机抽样(SRSWOR)。从N个个体中随机抽取n个个体,每次抽取一个个体,且抽取后不再放回。例如:13,16,21,25,30;15,19,22,35,52
- 有放回简单随机抽样(SRSWR),与无放回类似,但是每次抽取个体之后,要放回。例如:13,15,21,25,30;13,19,22,30,35
- 簇抽样,先将总体分为多个不相交的簇,然后再抽取一个或多个簇作为样本,要求簇内的差异较大,簇之间的差异较小,从而使得簇抽取的样本具有代表性。例如:13,20,30,40,70
- 分层抽样,将总体分为多个不相交的部分,叫做层,然后按照一定的比例在每个层中进行抽样,要求层内差异较大,层之间的差异较小。例如:16,25,35,40,70
18
( a )
- 将数值属性的取值按照升序进行排序。
- 初始化每个取值为一个单独的区间。
- 计算相邻区间的 χ 2 \chi^2 χ2值,选择具有最小 χ 2 \chi^2 χ2值的相邻区间。
- 如果选择的相邻区间的 χ 2 \chi^2 χ2值小于预先设定的停止标准,则将这两个区间合并为一个新的区间,并重新计算新区间的 χ 2 \chi^2 χ2值。
- 重复步骤3和步骤4,不断递归,直到满足停止标准,即没有相邻区间的 χ 2 \chi^2 χ2值小于停止标准或者达到设定的最大区间数。
( b )
def read(file):
'''从文件中读取原始数据'''
Instances = []
fp = open(file, 'r')
for line in fp:
line = line.strip('\n') # 去除'\n'
if line != '':
Instances.append(line.split(','))
fp.close()
return Instances
def split(Instances, i):
'''拆分4个属性,收集第i个属性的数据,i=0,1,2,3
返回一个类似[['0.2', 'Iris-setosa'], ['0.2', 'Iris-setosa'], ...]的列表'''
log = []
for r in Instances:
log.append([r[i], r[4]])
return log
def count(log):
'''统计相同记录的数量
返回一个类似[['4.3', 'Iris-setosa', 1], ['4.4', 'Iris-setosa', 3], ...]的列表'''
log_cnt = []
log.sort(key=lambda log: log[0])
i = 0
while i < len(log):
cnt = log.count(log[i]) # 统计相同记录的数量
record = log[i][:]
record.append(cnt) # append的返回值是None
log_cnt.append(record)
i += cnt # 统计下一个不同的项
return log_cnt
def build(log_cnt):
'''构建一个适用于ChiMerge算法的结构(元组的列表)'''
log_dic = {}
for record in log_cnt:
if record[0] not in log_dic.keys():
log_dic[record[0]] = [0, 0, 0]
if record[1] == 'Iris-setosa':
log_dic[record[0]][0] = record[2]
elif record[1] == 'Iris-versicolor':
log_dic[record[0]][1] = record[2]
elif record[1] == 'Iris-virginica':
log_dic[record[0]][2] = record[2]
else:
raise TypeError("数据异常")
log_truple = sorted(log_dic.items())
return log_truple
def collect(Instances, i):
'''收集用于离散化的数据'''
log = split(Instances, i)
log_cnt = count(log)
log_tuple = build(log_cnt)
return log_tuple
def combine(a, b):
'''a=('4.4', [3, 1, 0]), b=('4.5', [1, 0, 2])
combine(a, b)=('4.4', [4, 1, 2])'''
c = a[:] # c[0]=a[0]
for i in range(len(a[1])):
c[1][i] += b[1][i]
return c
def chi2(A):
'''计算卡方值'''
m = len(A)
k = len(A[0])
R = []
for i in range(m):
sum = 0
for j in range(k):
sum += A[i][j]
R.append(sum)
C = []
for j in range(k):
sum = 0
for i in range(m):
sum += A[i][j]
C.append(sum)
N = 0
for ele in C:
N += ele
res = 0
for i in range(m):
for j in range(k):
Eij = R[i] * C[j] / N
if Eij != 0:
res = res + (A[i][j] - Eij) ** 2 / Eij
return res
def ChiMerge(log_tuple, max_interval):
'''ChiMerge算法'''
'''返回分割点'''
num_interval = len(log_tuple)
while num_interval > max_interval:
num_pair = num_interval - 1
chi_values = []
for i in range(num_pair):
arr = [log_tuple[i][1], log_tuple[i + 1][1]]
chi_values.append(chi2(arr))
min_chi = min(chi_values) # 获取最小卡方值
for i in range(num_pair - 1, -1, -1): # 从最后一个开始处理
if chi_values[i] == min_chi:
log_tuple[i] = combine(log_tuple[i], log_tuple[i + 1]) # 合并两个相邻的区间
log_tuple[i + 1]= '合并'
while '合并' in log_tuple: # 移除合并的记录
log_tuple.remove('合并')
num_interval = len(log_tuple)
split_points = [record[0] for record in log_tuple]
return split_points
def discrete(path):
'''对鸢尾花数据库进行ChiMerge离散化'''
Instances = read(path)
max_interval = 6
num_log = 4
for i in range(num_log):
log_tuple = collect(Instances, i) # 收集离散化数据
split_points = ChiMerge(log_tuple, max_interval) # 使用ChiMerge算法进行离散化
print(split_points)
if __name__ == '__main__':
discrete('iris.csv')
分裂点为:
['4.3', '4.9', '5.0', '5.5', '5.8', '7.1']
['2.0', '2.3', '2.5', '2.9', '3.0', '3.4']
['1.0', '3.0', '4.5', '4.8', '5.0', '5.2']
['0.1', '1.0', '1.4', '1.7', '1.8', '1.9']