1、
简述分类与聚类的联系与区别。
简述什么是监督学习与无监督学习。
分类与聚类:分类是一种有监督的算法,是在已经有目标分类的情况下对数据进行类别判断(朴素贝叶斯算法)。而聚类是一种无监督算法,是在建立模型之前还没有目标分类,将特征相似的数据自动聚为一类的算法(KMeans聚类算法)。
有监督学习和无监督学习:有监督学习是在建立模型之前已经给出训练数据集,机器根据训练数据集训练出模型并对新数据进行预测。无监督学习是对未进行人工标注的数据进行分析,机器根据数据间的相似性自行分类。相似度高的数据会被聚为一类。
2、
朴素贝叶斯分类算法 实例
利用关于心脏情患者的临床数据集,建立朴素贝叶斯分类模型。
有六个分类变量(分类因子):性别,年龄、KILLP评分、饮酒、吸烟、住院天数
目标分类变量疾病:–心梗–不稳定性心绞痛
新的实例:–(性别=‘男’,年龄<70, KILLP=‘I',饮酒=‘是’,吸烟≈‘是”,住院天数<7)
最可能是哪个疾病?
上传演算过程。
假设患有心梗为事件A,患有心绞痛为事件B。性别为男为x1,年龄<70为x2,KILLP=1为x3,饮酒为x4,吸烟为x5,住院<7为x6.
p(x1|A)=7/16 P(X2|A)=4/16 P(X3|A)=9/16
P(X4|A)=3/16 P(X5|A)=7/16 P(X6|A)=4/16
P(X1,X2,X3,X4,X5,X6|A)=7/16*4/16*9/16*3/16*7/16*4/16=0.001262
p(X1|B)=1/4 P(X2|B)=1/4 P(X3|B)=1/4
P(X4|B)=1/4 P(X5|B)=2/4 P(X6|B)=2/4
P(X1,X2,X3,X4,X5,X6|B)=1/4*1/4*1/4*1/4*2/4*2/4=0.000977
p(A|x)=p(x|A)*P(A)/P(X)=0.001009/P(X)
P(B|X)=P(x|B)*p(B)/P(X)=0.000195/P(X)
因为分母是相同的,只要比较分子的数就行。
所以该患者的症状是患心梗的可能更大
3、编程实现朴素贝叶斯分类算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 1import pandas as pd
2import numpy as np
3
4dataDF = pd.read_excel(r'data/心脏病患者临床数据.xlsx')
5
6# 数据处理,对男女(男1女0),年龄(<70 -1,70-80 0,>80 1),
7# 住院天数(<7 -1,7-14 0,>14 1)三个列进行处理
8sex = []
9for s in dataDF['性别']:
10 if s == '男':
11 sex.append(1)
12 else:
13 sex.append(0)
14
15age = []
16for a in dataDF['年龄']:
17 if a == '<70':
18 age.append(-1)
19 elif a == '70-80':
20 age.append(0)
21 else:
22 age.append(1)
23
24days = []
25for d in dataDF['住院天数']:
26 if d == '<7':
27 days.append(-1)
28 elif d == '7-14':
29 days.append(0)
30 else:
31 days.append(1)
32
33# 另外生成一份处理后的DF
34dataDF2 = dataDF
35dataDF2['性别'] = sex
36dataDF2['年龄'] = age
37dataDF2['住院天数'] = days
38
39# 转为数组用于计算
40dataarr = np.array(dataDF)
41dataarr
42
43# 用贝叶斯模型判断病人属于哪种病:性别=‘男’,年龄<70, KILLP=1,饮酒=‘是’,吸烟=‘是”,住院天数<7
44def beiyesi(sex, age, KILLP, drink, smoke, days):
45 # 初始化变量
46 x1_y1,x2_y1,x3_y1,x4_y1,x5_y1,x6_y1 = 0,0,0,0,0,0
47 x1_y2,x2_y2,x3_y2,x4_y2,x5_y2,x6_y2 = 0,0,0,0,0,0
48 y1 = 0
49 y2 = 0
50
51 for line in dataarr:
52 if line[6] == '心梗':# 计算在心梗条件下出现各症状的次数
53 y1 += 1
54 if line[0] == sex:
55 x1_y1 += 1
56 if line[1] == age:
57 x2_y1 += 1
58 if line[2] == KILLP:
59 x3_y1 += 1
60 if line[3] == drink:
61 x4_y1 += 1
62 if line[4] == smoke:
63 x5_y1 += 1
64 if line[5] == days:
65 x6_y1 += 1
66 else: # 计算不稳定性心绞痛条件下出现各症状的次数
67 y2 += 1
68 if line[0] == sex:
69 x1_y2 += 1
70 if line[1] == age:
71 x2_y2 += 1
72 if line[2] == KILLP:
73 x3_y2 += 1
74 if line[3] == drink:
75 x4_y2 += 1
76 if line[4] == smoke:
77 x5_y2 += 1
78 if line[5] == days:
79 x6_y2 += 1
80 # print('y1:',y1,' y2:',y2)
81
82
83 # 计算,转为x|y1, x|y2
84 # print('x1_y1:',x1_y1, ' x2_y1:',x2_y1, ' x3_y1:',x3_y1, ' x4_y1:',x4_y1, ' x5_y1:',x5_y1, ' x6_y1:',x6_y1)
85 # print('x1_y2:',x1_y2, ' x2_y2:',x2_y2, ' x3_y2:',x3_y2, ' x4_y2:',x4_y2, ' x5_y2:',x5_y2, ' x6_y2:',x6_y2)
86 x1_y1, x2_y1, x3_y1, x4_y1, x5_y1, x6_y1 = x1_y1/y1, x2_y1/y1, x3_y1/y1, x4_y1/y1, x5_y1/y1, x6_y1/y1
87 x1_y2, x2_y2, x3_y2, x4_y2, x5_y2, x6_y2 = x1_y2/y2, x2_y2/y2, x3_y2/y2, x4_y2/y2, x5_y2/y2, x6_y2/y2
88 x_y1 = x1_y1 * x2_y1 * x3_y1 * x4_y1 * x5_y1 * x6_y1
89 x_y2 = x1_y2 * x2_y2 * x3_y2 * x4_y2 * x5_y2 * x6_y2
90
91
92 # 计算各症状出现的概率
93 x1,x2,x3,x4,x5,x6 = 0,0,0,0,0,0
94 for line in dataarr:
95 if line[0] == sex:
96 x1 += 1
97 if line[1] == age:
98 x2 += 1
99 if line[2] == KILLP:
100 x3 += 1
101 if line[3] == drink:
102 x4 += 1
103 if line[4] == smoke:
104 x5 += 1
105 if line[5] == days:
106 x6 += 1
107 # print('x1:',x1, ' x2:',x2, ' x3:',x3, ' x4:',x4, ' x5:',x5, ' x6:',x6)
108 # 计算
109 length = len(dataarr)
110 x = x1/length * x2/length * x3/length * x4/length * x5/length * x6/length
111 # print('x:',x)
112
113 # 分别计算 给定症状下心梗 和 不稳定性心绞痛 的概率
114 y1_x = (x_y1)*(y1/length)/x
115 # print(y1_x)
116 y2_x = (x_y2)*(y2/length)/x
117
118 # 判断是哪中疾病的可能性大
119 if y1_x > y2_x:
120 print('该病人患心梗的可能性较大,可能性为:',y1_x)
121 else:
122 print('该病人患不稳定性心绞痛的可能性较大,可能性为:',y2_x)
123
124# 判断:性别=‘男’,年龄<70, KILLP=1,饮酒=‘是’,吸烟=‘是”,住院天数<7
125beiyesi(1,-1,1,'是','是',-1)
126