Slope One算法优点:算法简单;扩展性好,只需要更新共有属性的用户评价,而不需要重新载入整个数据集。
Slope One算法的缺点:稀疏性,需要基于用户的评分数据; 3、分类算法(1)基于物品特征值的KNN分类算法代码实现 鸢尾花KNN分类算法... # 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 ...复制代码前面我们讨论的协同推荐算法需要在用户产生的各种数据上面进行分析,因此也称为社会化过滤算法,而这种算法通常有数据的稀疏性,算法可扩展性以及依赖于用户的数据的缺点,而基于物品特征值分类算法可以改善这些问题。算法分为两步:
第一步、选取特征值
算法的关键在于挑取有代表区分意义的特征及分值。以Iris花的示例,选取花萼长度, 花萼宽度,花瓣长度,花瓣宽度特征值。
第二歩、计算距离
比如计算测试集与训练集特征值之间的曼哈顿距离,得到k个最近邻后并通过加权后的结果预测分类。
KNN分类算法的缺点:无法对分类结果的置信度进行量化;是被动学习的算法,每次测试需要需要遍历所有的训练集后才能分类。 (2)贝叶斯分类算法代码实现 区分新闻类别朴素贝叶斯分类算法...def train_data(self): #训练组的条件概率 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] #优化条件概率公式 self.prob[category][word] = (count + 1) / (self.total[category] + len(self.vocabulary)) ...复制代码贝叶斯分类算法是基于概率的分类算法。相比于KNN分类算法,它是主动学习的算法,它会根据训练集建立一个模型,并用这个模型对新样本进行分类,速度也会快很多。贝叶斯分类算法的理论基础是基于条件概率的公式(应用于现实中P(X|Y&Z)不直观得出,而P(Y|X)*P(Z|X)比较直观得出),并假设已存在的子事件(y,z...实际应用中会有多个)间是相互独立的(因此也称为朴素贝叶斯),当y,z事件假设为独立便有:
通过对W,b两个参数求偏导,不断迭代往下坡的的位置移动(对w,b值往极小值方向做优化,其中α为学习率控制下降的幅度),全局最优解也就是代价函数(成本函数)J (w,b)这个凸函数的极小值点。第五步、通过训练好的W,b预测分类。 4、聚类算法(1)层次聚类代码实现 狗的种类层次聚类层次聚类将每条数据都当作是一个分类,每次迭代的时候合并距离最近的两个分类,直到剩下一个分类为止。 (2)K-means++聚类代码实现 Kmean++聚类注:Kmean算法与Kmean++区别在于初始的中心点是直接随机选取k各点。
... #kmean初始化随机k个中心点 #random.seed(1) #center = [[self.data[r] for i in range(1, len((self.data)))] #for r in random.sample(range(len(self.data)), k)] # Kmean ++ 初始化基于距离份量随机选k个中心点 # 1.随机选择一个点 center = [] center.append(random.choice(range(len(self.data[0])))) # 2.根据距离的概率选择其他中心点 for i in range(self.k - 1): weights = [self.distance_closest(self.data[0][x], center) for x in range(len(self.data[0])) if x not in center] dp = [x for x in range(len(self.data[0])) if x not in center] total = sum(weights) #基于距离设定权重 weights = [weight/total for weight in weights] num = random.random() x = -1 i = 0 while i < num : x += 1 i += weights[x] center.append(dp[x]) ... 复制代码k-means++算法可概括为:
(1)基于各点到中心点得距离分量,依次随机选取到k个元素作为中心点:先随机选择一个点。重复以下步骤,直到选完k个点。
计算每个数据点dp(n)到各个中心点的距离(D),选取最小的值D(dp);
根据D(dp)距离所占的份量来随机选取下一个点作为中心点。
(2)根据各点到中心点的距离分类;
(3)计算各个分类新的中心点。重复(2、3),直至满足条件。